在搜索了一段时间之后,我相信我需要问这个问题: 如何在视图中的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
答案 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>