【问题标题】:Rails 2 Render ERb template in controller?Rails 2 在控制器中渲染 ERb 模板?
【发布时间】:2012-12-31 14:00:29
【问题描述】:

控制器中的这段代码

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 helper,操作码错误

undefined method `url_for' for nil:NilClass

我在控制器里加了av.extend ActionController::UrlWriter,还是报错

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

【问题讨论】:

  • 你的意思是在模型中?

标签: ruby-on-rails render helper actionview


【解决方案1】:

试试:

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

【讨论】:

    【解决方案2】:

    通常,在 Rails 中,当某些事情非常困难时,是因为您没有从理想的角度解决问题。除了建议不要这样做之外,我无法直接回答这个问题。理想情况下,视图逻辑应该在视图中,而不是控制器中。除了一些罕见的例外,比如在 flash 消息中使用 link_to 助手 (which can be easily solved),这些问题应该分开。这似乎不是这些例外之一。相反,我会推荐以下技术之一(稍微多一点 Rails-y):

    选项 1:

    您似乎正在尝试为 show 操作渲染视图。这可以通过使用render :action => 'show' (docs) 轻松完成。这不会运行该操作的代码,只需使用该视图。

    选项 2

    如果选项 1 在您的情况下不可行,您也可以考虑以下技术的一些变体。照常渲染默认视图。将视图的现有内容移动到部分中,并将您的新内容移动到它自己的部分中。然后在您的视图中,只需根据适当的条件(@user 的存在)切换部分以呈现,例如:render :partial => @user ? 'new_content' : 'existing_content'。根据您的应用程序结构,这可能会进一步简化,只需从您的显示视图和问题中引用的操作的视图中呈现相同的部分。

    我认为,通过遵循principle of least astonishment,将应用程序的各种元素隔离到它们的预期关注点中不仅可以使开发和维护更容易,而且通常还可以使应用程序更容易测试。很抱歉没有回答您的问题 - 无论如何希望这会有所帮助。

    【讨论】:

      【解决方案3】:

      我想它是在控制器外部调用的,所以我在 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 })
      

      【讨论】:

        猜你喜欢
        • 2014-01-24
        • 2012-06-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-05-14
        • 1970-01-01
        • 2012-07-27
        • 2014-05-23
        相关资源
        最近更新 更多