获取和查看Rails应用程序中常用数据的最有效方法是什么?

时间:2012-10-05 16:37:44

标签: ruby-on-rails ruby-on-rails-3.2 relational-database rails-activerecord

我有三个模型都通过has_many :through方法相互关联。

ProgramCategory
ProgramSubcategory
Program

在我的应用程序中,我需要经常使用ProgramCategory.title,ProgramSubcategory.title和Program.title。可以说,会有一个动态的侧边栏菜单,它看起来像这样:

|- Shows (ProgramCategory)
  |- Action (ProgramSubcategory)
    |- Lost (Program)
    |- Games of Thrones (Program)
    |- Dexter (Program)

因为我知道application_controllerapplication_helperpartials的力量;我觉得把所有这些结合在一起以找到最合适的方式感到迷茫。

我应该在哪里以及如何打电话给我的模特?我应该在哪里构建我的方法以通过我的所有控制器访问它?我应该简单地创建一个部分并在application布局中呈现它吗?

我需要一些专家的启发,请...

感谢。

2 个答案:

答案 0 :(得分:0)

如果此侧栏显示在整个应用程序的每个视图中,则可以将其添加到应用程序布局中。然后在应用程序控制器中添加一个before过滤器以获取数据,这将从每个从应用程序控制器继承的控制器中的每个操作执行。您也可以将其限制为特定操作,例如:index:show(对于每个控制器)。

class ApplicationController < ActionController::Base
  before_filter :get_side_bar, :only => [:index, :show]

  def get_side_bar
    #@sidebar = some code
  end
end

然后您可以使用辅助方法(如果需要)并在应用程序布局中渲染@sidebar

如果你需要为某些控制器跳过这个动作,你也可以这样做,这个将跳过应用程序控制器,然后过滤除OtherController中的索引之外的任何东西:

class OtherController < ApplicationController
  skip_before_filter :get_side_bar, :except => [:index]
end

答案 1 :(得分:0)

此导航栏不是您显示的数据的核心部分,对于所有页面,它或多或少都相同。因此,它不属于控制器。

将其作为辅助方法,并将其结果缓存在视图中:

app/helpers/sidebar_helper.rb

module SidebarHelper
  def sidebar_data
    # blahblah, use any tag helper (include it here if necessary)
    # just remember to 
  end
end

app/controllers/your_controller.rb

class YourController < ApplicationController
  helper :sidebar
  # ...

(或将帮助器方法放在应用程序助手中以使其随处可用)

app/views/application/_sidebar.html.haml

- cache do
  # well, put here whatever you need to output the sidebar
  # use the sidebar_data, which should return precooked data on 
  # which you can build your nested <ul>s.
  # just indent it two spaces, so it's inside the "cache do" block

app/views/application/_sidebar.html.erb

<% cache do %>
  same as above, don't worry about indentation
<% end -%>

并在适当的地方加入部分

<%= render 'sidebar' %>