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:
...

ActionView::Base の RAILS-3.1 render メソッドにも同様の質問がありますが、役に立ちません。

プレゼンターレイヤーからこのパーシャルをレンダリングする方法は?

4

2 に答える 2

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
于 2012-12-30T15:54:52.713 に答える
1

これは、プレゼンター パターンの典型ではありません。プレゼンターは、ビューのレンダリング タスクを簡素化するために必要な複雑なデータとロジックを一元化するためのものです。ここでは、プレゼンター内でレンダリングしています。これは本当にあなたが意図したものですか?

答えはイエスと言ってください。ここに示すようActionView::Baseに、初期化は簡単ではないため、新しいものを作成するだけで問題が発生します。クラスまたは他の種類のネストで何か奇妙なことが起こっています。エラー メッセージのプレフィックスはどこから来ましたか? アプリについて必要な情報がすべて提供されていないようです。passion_concept_

レンダリングの場所をプレゼンターに明示的に伝えることで、喜びを感じることができます。

class FormPresenter

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

end

次に、ビューで:

= FormPresenter.render_form(self)

(ここでも説明は明確ではありません。何AddFormPresenterですか?) 現時点ではこれを試すことができるマシンはありませんが、あなたが持っているものよりもデバッグしやすいはずです。

于 2012-12-28T02:50:37.647 に答える