控制器中的此代码
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 :(得分:2)
尝试:
content = render_to_string(:file => "show", :locals => { :user => @user })
答案 1 :(得分:0)
通常,在Rails中,当某些事情非常困难时,这是因为你没有从理想的角度接近问题。我不能直接回答这个问题,除了建议不要这样做。理想情况下,视图逻辑应该在视图中,而不是控制器。除了一些罕见的例外,比如在flash消息(which can be easily solved)中使用link_to帮助程序,这些问题应该分开。这似乎不是其中一个例外。相反,我会推荐以下(稍微多一些Rails-y)技术之一:
选项1:
看起来您正在尝试渲染show动作的视图。使用render :action => 'show'
(docs)可以轻松完成此操作。这不会运行操作的代码,只需使用该视图。
选项2
如果选项1在您的情况下不可行,您可以考虑采用以下技术的一些变体。像往常一样渲染默认视图。将视图的现有内容移动到部分,并将您的新内容转换为部分内容。然后在您的视图中,只需根据适当的条件切换部分渲染,即@user的存在,对于此示例:render :partial => @user ? 'new_content' : 'existing_content'
。根据您的应用程序结构,可以通过在展示视图中呈现相同的部分以及在问题中引用的操作的视图来进一步简化这一过程。
我认为将应用程序的各个元素保持在其预期的关注点不仅可以通过遵循principle of least astonishment来更容易地开发和维护,而且通常也使应用程序更容易测试。很抱歉没有回答你的问题 - 无论如何,希望这会有所帮助。
答案 2 :(得分: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 })