我有QuestionController 我现在有一个AnotherQuestionController,其中的动作应该使用app / views / question /中的模板和部分进行渲染 这可能吗?看起来应该是这样。
我试过
render :template => "question/answer"
但answer.html.erb包含部分内容,我收到错误,如
“视图路径中缺少模板another_question / _my_partial.erb”
那么有没有办法告诉Rails“将AnotherQuestionController视为其QuestionController并在app / views / question中查找视图和部分”? 或者我是否必须创建app / views / another_question - 这将导致重复(这不能是Rails方式)。
由于
答案 0 :(得分:52)
模板渲染实际上应该有效
render :template => "question/answer"
你遇到的问题是看到错误的地方。修复很简单,只需在任何共享模板中使您的部分绝对。例如,question / answer.html.erb应该有
<%= render :partial => 'question/some_partial' %>
而不是通常的
<%= render :partial => 'some_partial' %>
答案 1 :(得分:12)
您可以通过以下方式实现:
render 'question/answer'
答案 2 :(得分:0)
您可以尝试我在http://github.com/ianwhite/inherit_views/tree/master的答案中提到的inherit_views插件(this question)。
答案 3 :(得分:0)
Rails使用前缀列表来解析模板和部分。正如您在另一个答案中所建议的那样,尽管您可以显式指定前缀(“问题/答案”),但是如果模板本身包括对其他部分的不合格引用,则此方法将失败。
假设您有一个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 / application /”下,而不是“ app / views / question /”下,两个控制器都可以使用。
解决方案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"]