如何在each_with_index循环中显示子类别的计数器?

时间:2014-11-11 06:17:06

标签: ruby-on-rails

在搜索了一段时间之后,我相信我需要问这个问题: 如何在视图中的Rails中的each_with_index循环中显示子类别的计数器?

我认为这将是Rails中常见的设计模式,但我还没有找到答案......所以这里有:

为了记录,我的环境是:ruby 2.0.0p353, rails Rails 4.1.4.

我有两个模型,标题和类别。从类别到标题之间存在1-M关系(这些是用于DVD目录应用程序):

类别模型:

class Category < ActiveRecord::Base
  has_many :titles
 end

标题模型:

class Title < ActiveRecord::Base
  belongs_to :category  
end

相关架构:

  create_table "categories", force: true do |t|
    t.string   "category_name"
    t.datetime "created_at"
    t.datetime "updated_at"
  end

  create_table "titles", force: true do |t|
    t.string   "title"
    t.integer  "year_published"
    t.datetime "created_at"
    t.datetime "updated_at"
    t.integer  "category_id"
  end

以下是我希望修改的视图

 <tbody>
    <% @titles.each_with_index do |title, index| %>
      <tr>
        <td><%= index %></td>
        <td><%= title.title %></td>
        <td><%= title.year_published %></td>
        <td><%= title.category.try(:category_name) %></td>
        <td><%= link_to 'Show', title %></td>
        <td><%= link_to 'Edit', edit_title_path(title) %></td>
        <td><%= link_to 'Destroy', title, method: :delete, data: { confirm: 'Are you sure?' } %></td>
      </tr>
    <% end %>
  </tbody>

当为标题显示 index.html 页面时,我会在我的视图中显示,该视图显示在类别中排序的标题,既是标题的总体计数器,也是标题的子计数器记录其类别中的条目,并使每个新类别将该计数器重置为零。

以下是我的标题控制器包含的内容,用于检索标题,并对类别中的标题进行排序:

@titles = Title.includes(:category).order("categories.category_name asc, title")

当我调用标题index.html页面时,看起来像(抱歉格式错误;字段显示为:

index, title_name, year_published, category, show/edit/destroy): 

    0   Cliffhanger 1993    Action  Show    Edit    Destroy
    1   Ironman I   2008    Action  Show    Edit    Destroy
    2   K2  1991    Action  Show    Edit    Destroy
    3   Bulworth    1998    Comedy  Show    Edit    Destroy
    4   Coming To America   1988    Comedy  Show    Edit    Destroy
    5   Forgetting Sarah Marshall   2008    Comedy  Show    Edit    Destroy
    6   My Blue Heaven  1990    Comedy  Show    Edit    Destroy
    7   A Lot Like Love 2005    Comedy/Romantic Show    Edit    Destroy
    8   Once    2006    Comedy/Romantic Show    Edit    Destroy
    9   Strictly Sexual 2008    Comedy/Romantic Show    Edit    Destroy
    10  The Other Side of the Mirror        Comedy/Romantic Show    Edit    Destroy
    11  Women On Top    2000    Comedy/Romantic Show    Edit    Destroy
    12  YFP 2007    Comedy/Romantic Show    Edit    Destroy
    13  A Crude Awakening   2006    Documentary Show    Edit    Destroy
...

如何添加第二个索引计数器,它将在类别中显示索引? (这实际上对于在目录中物理存储DVD非常有帮助。)

许多TIA, --rixter

2 个答案:

答案 0 :(得分:1)

您可以为标题创建一个创建类别计数器的视图助手:

# app/helpers/title_helper.rb
module TitleHelper
  def category_index(title)
    @category_counter ||= []
    @category_counter[title.category_id] ||= -1
    @category_counter[title.category_id] += 1
  end
end

这为每个类别添加了标题的滚动计数器。然后在index.html.erb

<% @titles.each_with_index do |title, index| %>
  ...
  <td><%= category_index(title) %></td>
  ...
<% end %>

这个限制是所有标题都需要从第一个标题开始迭代。如果像分页这样的东西发挥作用,或者index.html.erb中的标题顺序与类别中的标题排序方式不同,那么这显然会中断(就像所有Ruby index解决方案一样)。

答案 1 :(得分:1)

为什么要迭代标题?为什么不迭代这些类别并在每个类别中迭代相关的标题?

然后你可以免费获得类别索引,并且很容易为总索引添加外部计数器。

编辑: 您可以像这样添加外部索引。

<tbody>
  <% outer_index = 0 %>
  <% @categories.each_with_index do |cat, cat_index| %>
    <% cat.titles.each do |title| %>
      <tr>
        <td><%= outer_index %></td>
        <td><%= cat_index %></td>
        <td><%= title.title %></td>
        <td><%= title.year_published %></td>
        <td><%= title.category.try(:category_name) %></td>
        <td><%= link_to 'Show', title %></td>
        <td><%= link_to 'Edit', edit_title_path(title) %></td>
        <td><%= link_to 'Destroy', title, method: :delete, data: { confirm: 'Are you sure?' } %></td>
      </tr>
      <% outer_index++ %>
    <% end %>
  <% end %>
</tbody>