web-dev-qa-db-ja.com

別のコントローラーのビューを使用してレンダリングする1つのコントローラー

私はQuestionControllerを持っています。app/views/question /のテンプレートとパーシャルを使用してレンダリングする必要があるアクションを持つAnotherQuestionControllerを持っています。これは可能ですか?それがあるべきようです。

私はもう試した

render :template => "question/answer"

しかし、answer.html.erbにはパーシャルが含まれており、次のようなエラーが発生します

「ビューパスにテンプレートanother_question/_my_partial.erbがありません」

Rails "AnotherQuestionControllerをQuestionControllerとして扱い、app/views/questionでビューとパーシャルを探す"と伝える方法はありますか?または、app/views/another_questionを作成する必要があります-これは重複を引き起こします(Rails way)にはできません)。

ありがとう

38
Paul

テンプレートのレンダリングは実際に機能するはずです

 render :template => "question/answer"

あなたが抱えていた問題は、パーシャルが間違った場所を探していることです。修正は簡単で、共有テンプレートでパーシャルを絶対的にするだけです。たとえば、question/answer.html.erbには

<%= render :partial => 'question/some_partial' %>

通常よりも

<%= render :partial => 'some_partial' %> 
58
Ben Hughes

あなたはそれを達成することができます:

render 'question/answer'
14
klew

Railsはテンプレートとパーシャルを解決するためにプレフィックスのリストを使用します。 canプレフィックス( "question/answer")を明示的に指定しますが、別の回答で提案されているように、テンプレート自体が他のパーシャルへの修飾されていない参照を含む場合、このアプローチは失敗します。

ApplicationControllerスーパークラスがあり、QuestionControllerがそのスーパークラスを継承しているとすると、場所Railsはテンプレートを検索しますが、「app/views/question /」と「app/views/application/"。(実際には、一連のビューパスも調べられますが、簡単にするためにここでは省略しています。)

次の場合:

class QuestionController < ApplicationController
end

class AnotherQuestionController < ApplicationController
end

QuestionController._prefixes
# => ["question", "application"]
AnotherQuestionController._prefixes
# => ["another_question", "application"]

ソリューション#1。パーシャルを「app/views/question /」ではなく「app/views/application /」の下に配置します。両方のコントローラに。

ソリューション#2。必要に応じて、QuestionControllerから継承します。

class AnotherQuestionController < QuestionController
end
=> nil
AnotherQuestionController._prefixes
# => ["another_question", "question", "application"]

ソリューション#3。クラスメソッドAnotherQuestionController :: local_prefixes を定義します

これはRails 4.2で追加されました。

class AnotherQuestionController < ApplicationController
  def self.local_prefixes
    super + ['question']
  end
end
AnotherQuestionController._prefixes
# => ["another_question", "question", "application"]
0
Steve

あなたはinherit_viewsプラグインを試すことができます( http://github.com/ianwhite/inherit_views/tree/masterこの質問 の回答でここで述べました。

0
Shadwell