You may have some reason to break outside MVC model and I won’t give you lecture why you shoudn’t really do it, neither I won’t describe how you will burn in hell for commiting that kind of sin. Instead I will provide a working solution how it can be done. Just as a example of bad pratice :P.
So – how to render view inside model in Rails 3.2?
Let’s start by creating an class that will inherit from AbstractController::Base. You will also need to include bunch of other classes that are required for rendering views, include url_helper, application helper and any other helpers that you may want to use, don’t forget to setup your views path.
# lib/render_abstract.rb
class RenderAbstract < AbstractController::Base
include AbstractController::Rendering
include AbstractController::Layouts
include AbstractController::Helpers
include AbstractController::Translation
include AbstractController::AssetPaths
include ActionDispatch::Routing
include Rails.application.routes.url_helpers
helper ApplicationHelper
self.view_paths = "app/views"
def show(article)
@article = article
render :partial => 'articles/show', :layout=>false
end
end
show
method will accept object of class Article
and setup variable accessible to view in standard fashion. Here’s how Article
model looks:
# app/models/article.rb
require 'render_abstract.rb'
class Article < ActiveRecord::Base
def render
RenderAbstract.new.show(self)
end
end
Calling render on article object should now render your view. How about that. Just don’t tell anyone ;-).
In next part I will give you some ideas how can you proxy your Rails application inside existing PHP project. The hunt for witches begins now.