2013-01-17 4 views
2

Этот код в контроллереRails 2 Render ERb шаблон в контроллере?

av = ActionView::Base.new(Rails::Configuration.new.view_path) 
av.extend ApplicationHelper 
content = av.render(:file => "show", :locals => { :user => @user }) 

и show.html.erb имеет ошибку link_to помощника, код операции

undefined method `url_for' for nil:NilClass 

добавляет av.extend ActionController::UrlWriter в контроллере, все еще ошибка

undefined method `default_url_options' for ActionView::Base:Class 
+0

вы имеете в виду в модели? – vinhboy

ответ

2

Попытка:

content = render_to_string(:file => "show", :locals => { :user => @user }) 
0

Обычно, в Rails, когда что-то очень сложно, это потому, что вы не подходите к проблеме с идеального угла. Я не могу ответить на этот вопрос напрямую, кроме как советовать не делать этого. В идеале логика просмотра должна быть в представлении, а не в контроллере. За некоторыми редкими исключениями, например, используя вспомогательный элемент link_to во флэш-сообщении (which can be easily solved), эти проблемы следует разделить. Это не похоже на одно из этих исключений. Вместо этого, я рекомендовал бы один из следующих методов (чуть больше Rails-у):

Вариант 1:

Похоже, что вы пытаетесь вынести мнение на шоу действия. Это можно легко выполнить, используя render :action => 'show' (docs). Это не будет запускать код для действия, просто используйте это представление.

Вариант 2

В том случае, если вариант 1 не является жизнеспособным в вашей ситуации, вы можете в качестве альтернативы рассмотреть некоторые вариации по следующей методике. Отобразить представление по умолчанию, как обычно. Переместите существующее содержимое представления в частичное, а ваше новое содержимое - в частичное. Тогда, на ваш взгляд, просто переключите частичное рендеринг, основанное на соответствующем условии - существование @user, для этого примера: render :partial => @user ? 'new_content' : 'existing_content'. В зависимости от вашей структуры приложения может быть, что это может быть упрощено, просто отринув одно и то же частичное из вашего представления просмотра и вид действия, упомянутого в вопросе.

Я думаю, что сохранение различных элементов приложения, изолированного от их предполагаемых задач, не только упрощает разработку и сопровождение, следуя principle of least astonishment, но также обычно делает приложение намного проще в тестировании. Извините, что не ответил на ваш вопрос - надеюсь, что это поможет.

0

Я предполагаю, что это был вызван вне контроллера, так что я сделать это таким образом в Rails 3:

av = ActionView::Base.new(Rails.configuration.paths["app/views"]) 
av.class_eval do 
    include ApplicationHelper 
    include Rails.application.routes.url_helpers 
    default_url_options[:host] = 'yoursite.com' 
    def protect_against_forgery? 
    false 
    end 
end 
@result = av.render(:file => "show", :locals => { :user => @user })