【问题标题】:One controller rendering using another controller's views一个控制器使用另一个控制器的视图进行渲染
【发布时间】:2010-11-04 00:44:43
【问题描述】:

我有 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 方式)。

谢谢

【问题讨论】:

    标签: ruby-on-rails view controller render


    【解决方案1】:

    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"]
    

    【讨论】:

    • 重要的是说:第二个解决方案在我的上下文中有效,当我对“AnotherQuestionController”的操作呈现包含部分渲染的视图时。谢谢!
    【解决方案2】:

    模板渲染应该可以正常工作

     render :template => "question/answer"
    

    您遇到的问题是局部看错了地方。修复很简单,只需在任何共享模板中使您的部分绝对。例如,question/answer.html.erb 应该有

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

    而不是通常的

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

    【讨论】:

    • 在 Rails 3.x 中有什么新方法吗?我之所以问,是因为我正在使用一个 gem,它可以让助手自动在视图中进行渲染(否则你的解决方案会起作用)。我宁愿不覆盖那个宝石的助手。谢谢!
    【解决方案3】:

    您可以通过以下方式实现:

    render 'question/answer'
    

    【讨论】:

    • 这是否也会触发该控制器中的所有 before_actions?
    • @MikanPotatos 它根本不会击中那个控制器。
    【解决方案4】:

    你可以试试我在this question的回答中提到的inherit_views插件(http://github.com/ianwhite/inherit_views/tree/master)。

    【讨论】:

    • 谢谢,我会调查的。似乎工作量很大,但不是。我原以为 render() 会采用允许指定另一个控制器的视图/部分的选项。嗯嗯。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-04-23
    • 1970-01-01
    • 2015-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-02
    相关资源
    最近更新 更多