Rails:渲染集合部分:获取部分内部的集合大小

时间:2012-11-15 12:49:42

标签: ruby-on-rails

我有一些我想用部分渲染的项目:

@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 %>

但我感觉像重复一样,因为渲染方法已经知道了集合的大小。

除了使用局部变量外,是否真的没有办法让集合中的项目总数达到局部?

2 个答案:

答案 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 %>