这个rails代码是否属于Application Controller?

时间:2011-07-22 13:12:06

标签: ruby-on-rails ruby ruby-on-rails-3

我有一些代码(这是有效的),但我只是想确保每个rails约定/最佳实践将它放在正确的位置。代码的目的是,如果定义了'@facility'(可以在几个控制器之一中完成),则生成一组子标题导航链接。现在,我将下面的代码分散开来,如下所示。

我的问题:这感觉不对,尤其是html模板开头的逻辑。我还想要定义一些其他类似的帮助器来根据不同的模型定义这些子头链接。这个逻辑(设置@subhead_links)应该在应用程序控制器中吗?作为每个模型中的一个方法(所以我会设置@subhead_links = @ facility.subhead_links)?

我看了一些答案,但这种哲学问题并不像错误代码一样容易google。

在应用程序助手

  # build subhead
  def subhead_links(facility)
      links = [
          { :label => "Configure Facility", :path => facility_path(facility) },
          { :label => "Waitlists", :path => waitlist_tiers_path(:id => facility.id) },
          { :label => "Applications", :path => sponsors_path(:id => facility.id) }
      return links
  end

部分包含在application.html.erb模板

<% if @facility %>
  <% @subhead_links = subhead_links(@facility) %>
<% end %>

<% if @subhead_links %>
  <nav class="subnav">
    <ul>
    <% @subhead_links.each do |link| %>
      <li><%= link_to link[:label], link[:path] %></li>
    <% end %>
    </ul>
  </nav>
<% end %>
各种其他控制器中的

......

@facility = Facility.find(params[:id])

1 个答案:

答案 0 :(得分:3)

我从不依赖于partials中的实例变量,并尝试在助手中尽可能多地使用逻辑。

这将导致以下结果:

application_layout:

<%= render_subhead_links(@facility) %>

application_helper:

def render_subhead_links(facility)
  if facility
    links = [
      { :label => "Configure Facility", :path => facility_path(facility) },
      { :label => "Waitlists", :path => waitlist_tiers_path(:id => facility.id) },
      { :label => "Applications", :path => sponsors_path(:id => facility.id) }
    render :partial_name, :links => links
  end
end

部分:

<nav class="subnav">
  <ul>
    <% links.each do |link| %>
      <li><%= link_to link[:label], link[:path] %></li>
    <% end %>
  </ul>
</nav>