在Ruby on Rails中从不同视图呈现部分的控制器代码的位置

时间:2010-08-29 14:16:54

标签: ruby-on-rails

一个新手问题:

我有一部分内容是我在不同页面的网站上加载。

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

我使用:locals

将查询结果传递给视图中的partial

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

或者我应该使用与partials不同的思考来进行这种用途吗?

亲切的问候, 迈克尔

2 个答案:

答案 0 :(得分:2)

我如何解决这个问题,就是在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语句,只要选择好名称,清楚地表明包含了哪些功能。

答案 1 :(得分:1)

您无需复制代码来设置部分数据,但 需要将其提升到两个控制器继承的控制器中。通常,这将是您的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添加到只是实际需要加载数据的控制器。
  3. 我希望这会有所帮助。