我有一个要用局部渲染的项目集合:
@items = ['a','b','c']
<%= render :collection => @items, :partial => 'item' %>
我想用 * 升序 * 来给元素编号。因此输出应为:
3: a
2: b
1: c
我知道rails在partial内部提供了一个计数器,所以如果我想对项目进行 * 降序 * 的编号,我可以创建下面的partial:
<%= item_counter %>: <%= item %>
这给了我
1: a
2: b
3: c
但是对于 * 升序 * 数字,我需要项目的总数,我可以提供局部到部分:
<%= render :collection => @items, :partial => 'item', :locals => {:total => @items.size} %>
然后在partial:
<%= total - item_counter %>: <%= item %>
但我觉得这像是重复,因为render方法已经知道集合的大小。
除了使用局部变量之外,真的没有办法在分部中获得集合的项目总数吗?
3条答案
按热度按时间swvgeqrz1#
以下是可能的自Rails版本4.2:
在partial中,您可以访问一个名为
collection_iteration
的函数/变量。调用collection_iteration.size
将给予总数。关于changelog:
当使用集合呈现分部时,迭代对象作为局部变量
#{template_name}_iteration
可用。它可以访问正在迭代的集合的
size
,当前的index
和两个方便的方法first?
和last?
。kgsdhlau2#
啊。想回答这个问题。但找到了正确答案。无论如何,这里有一个关于未来的提示。您可以使用Ruby元编程来研究Rails机制。例如,通过在视图中调用方法'Kernel#local_variables',在我的示例中输出:
万一
xv8emn3q3#
对于Rails的最新版本,比如Rails 7,如果你渲染的是一个像这样的部分:
然后,在部分代码中,您应该可以访问
item_iteration
,并使用item_iteration.size
获取总大小。您还应该可以访问item_counter
,这是当前索引。