如何从presenter层渲染rails部分?

时间:2012-12-20 07:50:09

标签: ruby-on-rails-3

好吧,我现在也使用rails 3.2.1进入这种情况 以下是app/presenters/form_presenter.rb

中的演示者
class FormPresenter
  def render_form
    ActionView::Base.new.render partial: "passions/add_form"
  end
end

从我打电话来看,

...
= AddFormPresenter.new.render_form
...

但它会出现以下错误:

13:14:12 ActionView::MissingTemplate - Missing partial passions/passion_concept_add_form with {:locale=>[:en], :formats=>[:html, :text, :js, :css, :ics, :csv, :png, :jpeg, :gif, :bmp, :tiff, :mpeg, :xml, :rss, :atom, :yaml, :multipart_form, :url_encoded_form, :json, :pdf, :zip], :handlers=>[:erb, :builder, :slim, :coffee, :rabl]}. Searched in:
...

RAILS-3.1 render method for ActionView::Base有这个类似的问题,但没有帮助。

如何从演示者图层渲染此部分?

2 个答案:

答案 0 :(得分:2)

好吧,我只是通过使用before过滤器抓取视图上下文来完成它。我的参考是:https://github.com/amatsuda/active_decorator/blob/master/lib/active_decorator/view_context.rb

类似于:

class FormPresenter
  def render_form
    FromPresenter.view_context.render partial: "passions/add_form"
  end

  class << self
    def view_context
      Thread.current[:view_context]
    end

    def view_context=(view_context)
      Thread.current[:view_context] = view_context
    end
  end

  module Controller
    extend ActiveSupport::Concern

    included do
      before_filter do |controller|
        FormPresenter.view_context = controller.view_context
      end
    end
  end
end

并在application_controller.rb

class ApplicationController < ActionController::Base
...
   include FormPresenter::Controller
...
end

答案 1 :(得分:1)

这不是典型的演示者模式。演示者用于集中简化视图渲染任务所需的复杂数据和逻辑。在这里,您将在演示者内部进行渲染。这真的是你想要的吗?

说答案是肯定的。然后只是创建一个新的ActionView::Base就会遇到麻烦,因为初始化它是非平凡的as shown here。有些奇怪的事情正在上课或其他类型的筑巢。 passion_concept_前缀来自错误消息中的哪个位置?看起来您并没有告诉我们您的应用所需的全部内容。

您可以通过明确告诉演示者在哪里呈现来获得快乐:

class FormPresenter

  def self.render_form(view)
    view.render partial: "passions/add_form"
  end

end

然后在视图中:

= FormPresenter.render_form(self)

(这里的解释还不清楚。什么是AddFormPresenter?)我没有一台机器,我现在可以尝试这个,但它应该比你有更多的可调试性