【问题标题】:Rails helper to find the current pathRails 帮助程序查找当前路径
【发布时间】:2017-09-23 00:06:54
【问题描述】:

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

这行得通:

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

但正如您所见,我对子类别 id - 1 进行了硬编码(只是为了测试它是否有效)。我以为我可以只传递 category.subcategory 而不是 1,但后来我得到 undefined subcategory for category with id 1 因为我的类别表没有对子类别的任何引用(只有子类别表有一个 category_id 行),所以我想我应该在 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 %>

【问题讨论】:

  • 为什么从 url 中抓取 subcategoryid 看起来不方便?
  • @Iceman - 因为我对 Rails 的期望更高 :) 类别和子类别之间存在联系,所以我认为也应该在这里建立它。也因为稍后我将从 url 中删除类别和子类别 id

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


【解决方案1】:

解决了:

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

【讨论】:

    【解决方案2】:

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

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

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

    在您的SubcategoriesHelper 中添加以下方法:

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

    如果has_child? 为真,这将返回"active"

    现在您可以在遍历Category 记录时在subcategories#show 视图中使用这个category_class 辅助方法:

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

    【讨论】:

    • category.subcategories 我试过了,肯定 - 没有错误,但效果不佳.. 我的关联很简单 - has_many 和 belongs_to
    • 是的,但对于前。 category.subcategories.first"active" if current_page?(category_subcategory_path(category, 1)) 的工作方式相同 - 我的意思是适用于该特定子类别