Rails helper查找当前路径

时间:2017-04-25 19:52:16

标签: ruby-on-rails twitter-bootstrap helper

我正在尝试创建一个助手,将Bootstrap“active”类添加到浏览器当前页面的导航选项卡中。问题是我有类别及其子类别,所以当当前页面是该类别的子类别时,我希望类别选项卡也是活动的。

这有效:

  def active?(category)
    "active" if current_page?(category_path(category) || category_subcategory_path(category, 1))
  end

但是你看到我硬编码子类别id - 1(只是为了测试它的工作原理)。我以为我可以只传递category.subcategory而不是1,但是我得到未定义的子类别用于ID为<1>的类别,因为我的类别表没有任何对子类别的引用(只有子类别表有一个< em> category_id row),所以我想我应该在Categories控制器中以某种方式定义子类别,但是如何?

还想抓住URI的最后一段(http://localhost:3000/categories/2/subcategories/5),但它看起来并不方便。

   <% @categories.each do |cat| %>
     <li class="<%= active?(cat) %>">
       <%= link_to cat.name.titleize, category_path(cat) %></td>
     </li>
   <% end %>
   <% @category.subcategories.each do |subcategory| %>
     <li>
       <%= link_to subcategory.name.titleize, category_subcategory_path(@category, subcategory) %></td>
     </li>
   <% end %>

2 个答案:

答案 0 :(得分:1)

将以下方法添加到Category模型中:

def has_child?(subcat)
  subcategories.include?(subcat) # probably better to match against ids
end

如果特定类别记录具有传入的true,则此方法将返回subcategory

SubcategoriesHelper内添加以下方法:

def category_class(cat, subcat)
  cat.has_child?(subcat) ? 'active' : '' 
end

如果"active"为真,则会返回has_child?

现在,在迭代category_class条记录时,您可以在subcategories#show视图中使用此Category辅助方法:

...
<% @categories.each do |cat| %>
  <li class="<%= category_class(cat, @subcategory) %>">
    <%= cat.title %>
  </li>
<% end %>
...

答案 1 :(得分:1)

解决它:

  def active?(category)
    "active" if
      current_page?(category_path(category)) || 
      current_page?(category_subcategory_path(controller: 'subcategories', action: 'show', category_id: category))
  end