放置应包含在所有或大多数视图中的查询的位置

时间:2011-11-26 17:47:37

标签: ruby-on-rails model-view-controller ruby-on-rails-3.1 partial-views

在我的应用程序中,我有一个侧边栏,我想要包含一个页面列表。在MVC设置上作弊,我可以很容易地显示如下(在HAML中):

# layouts/_sidebar.html.haml
%h4 Pages
%ul.pages
  - for page in Page.all
    %li= link_to page.title, page

现在,这很好用,但显然它不符合惯例。问题是,这个共享布局部分存在于大多数(但不是全部)视图中,因此从控制器层提供页面意味着需要将实例变量注入到应用程序中的几乎每个控制器动作中。那不是很干净或干。

那么,你会如何处理这种情况?是否有一个干净,干净的地方来放置这种简单的查询更好地尊重Rails MVC约定?

2 个答案:

答案 0 :(得分:2)

恕我直言,处理此类情况的最佳方法是使用cell gem

答案 1 :(得分:1)

不确定。经典的方法是通过应用程序控制器中的before_filter:

# controllers/application_controller.rb
before_filter :get_pages

def get_pages
  @pages = Page.all
end

# layouts/application.html.erb (adjust for HAML)
<%= unless @pages.empty? %> # safety
  <%= render 'shared/_sidebar' %>
<% end %>

# Using a 'shared' directory is more common for these components
# than stuffing everything into layouts, but it doesn't really matter.
#
# shared/_sidebar.html.haml
%h4 Pages
%ul.pages
- for page in @pages
  %li= link_to page.title, page