我有三个模型都通过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_controller
,application_helper
和partials
的力量;我觉得把所有这些结合在一起以找到最合适的方式感到迷茫。
我应该在哪里以及如何打电话给我的模特?我应该在哪里构建我的方法以通过我的所有控制器访问它?我应该简单地创建一个部分并在application
布局中呈现它吗?
我需要一些专家的启发,请...
感谢。
答案 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' %>