我有一些我想用部分渲染的项目:
@items = ['a','b','c']
<%= render :collection => @items, :partial => 'item' %>
我想用升序号对元素进行编号。所以输出应该是:
3: a
2: b
1: c
我知道rails在partial中提供了一个计数器,所以如果我想对降序项进行编号,我可以创建以下部分:
<%= item_counter %>: <%= item %>
给了我
1: a
2: b
3: c
但是对于升序数字,我需要项目的总数,我可以用局部的部分提供:
<%= render :collection => @items, :partial => 'item', :locals => {:total => @items.size} %>
然后在部分:
<%= total - item_counter %>: <%= item %>
但我感觉像重复一样,因为渲染方法已经知道了集合的大小。
除了使用局部变量外,是否真的没有办法让集合中的项目总数达到局部?
答案 0 :(得分:14)
从Rails版本4.2 :
开始,可能如下在部分内部,您可以访问名为collection_iteration
的函数/变量。致电collection_iteration.size
将为您提供总数。
来自changelog:
迭代对象可用作局部变量 使用集合渲染部分时
#{template_name}_iteration
。它允许访问正在迭代的集合的
size
, 当前index
和两种便捷方法first?
和last?
。
答案 1 :(得分:0)
啊。想回答这个问题。但是找到了正确答案。无论如何,这里都是未来的秘诀。您可以使用Ruby元编程来研究Rails机制。例如,通过在视图中调用方法“ Kernel#local_variables”,在我的情况下输出:
[0] = :local_assigns
[1] = :output_buffer
[2] = :row
[3] = :row_counter
[4] = :row_iteration
[5] = :highlighted_description
[6] = :source_description
如果
<%= render partial: 'card', collection: @offers, as: :row %>