【问题标题】:where to put controller code for partials you render from different views in Ruby on Rails在 Ruby on Rails 中从不同视图呈现的局部控制器代码放置在哪里
【发布时间】:2010-08-29 14:16:53
【问题描述】:

一个新手问题:

我有一部分要加载到网站的不同页面上。

那部分需要一些数据,所以在父视图的控制器中我进行查询: @properties = Property.find(:all)

我使用 :locals 将查询结果传递给视图中的部分

现在,我想从另一个视图渲染相同的部分。这个视图有一个不同的控制器。我是否还必须在该控制器中重复查询?或者我可以有一个单独的控制器来控制我在网站上使用更多地方的部分。在最后一种情况下,当我放置渲染命令时,如何在视图中指示要使用哪个控制器?

或者我应该使用与局部不同的想法来进行这种使用?

亲切的问候, 迈克尔

【问题讨论】:

    标签: ruby-on-rails


    【解决方案1】:

    我将如何解决这个问题,是在您的 lib 文件夹中定义一个新文件,并使用有意义的名称。现在我只使用does_as_shared.rb:

    module DoesAsShared
      def setup_shared_data
        @shared_data = ...do something useful here ...
      end
    end
    

    然后在需要您编写的代码的控制器内部:

    class ThingsController < ApplicationController
      include DoesAsShared
    
      def index
        setup_shared_data
        .. and do some more stuff ...
      end
    end
    

    此代码的优点是共享代码仅限于那些真正需要它的控制器。同时它也非常易读:include 语句,考虑到名称选择得当,清楚地表明包含了哪些功能。

    【讨论】:

      【解决方案2】:

      您无需复制代码来设置部分数据,但您需要将其提升到您的两个控制器继承自的控制器中。通常,这将是您的ApplicationController。在其中定义一个加载所需数据的方法。例如:

      class ApplicationController < ActionController::Base
        # ... your code ...
      
      protected
      
        def load_partial_data
          @properties = Property.find(:all)
        end
      
      end
      

      现在要实际调用此方法,您有两个选择:

      1. 如果您的所有控制器都需要此数据,请将before_filter 添加到您的ApplicationController,例如before_filter :load_partial_data
      2. 否则,将before_filter 添加到只是实际需要加载数据的控制器。

      我希望这会有所帮助。

      【讨论】:

        猜你喜欢
        • 2012-09-07
        • 2010-11-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-11-16
        • 2011-12-06
        • 2011-08-05
        相关资源
        最近更新 更多