私は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)にはできません)。
ありがとう
テンプレートのレンダリングは実際に機能するはずです
render :template => "question/answer"
あなたが抱えていた問題は、パーシャルが間違った場所を探していることです。修正は簡単で、共有テンプレートでパーシャルを絶対的にするだけです。たとえば、question/answer.html.erbには
<%= render :partial => 'question/some_partial' %>
通常よりも
<%= render :partial => 'some_partial' %>
あなたはそれを達成することができます:
render 'question/answer'
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"]
あなたはinherit_viewsプラグインを試すことができます( http://github.com/ianwhite/inherit_views/tree/master ) この質問 の回答でここで述べました。