2012-12-20 33 views
4

嗯,我到这个情况,以及现在使用的轨道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但它没有帮助。

如何从演示者层呈现此部分?

回答

1

这不是典型的主持人模式。演示者用于集中复杂的数据和逻辑,以简化视图的渲染任务。在这里,您正在渲染器内渲染。这真的是你想要的吗?

说出答案是肯定的。然后只是创建一个新的ActionView::Base正在寻求麻烦,因为初始化它是不平凡的as shown here。一些奇怪的事情发生在班级或其他类型的嵌套上。 passion_concept_前缀来自错误消息的位置在哪里?看起来你没有告诉我们我们需要关于你的应用的所有信息。

您可以告诉主持人明确它的渲染找到快乐:在视图

class FormPresenter 

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

end 

然后:(?这里的解释又是不清楚什么是AddFormPresenter

= FormPresenter.render_form(self) 

我现在没有一台机器可以试用,但它应该比你有更多的可调试性。

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