13

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

@items = ['a','b','c']

<%= render :collection => @items, :partial => 'item' %>

我想用升序对元素进行编号。所以输出应该是:

3: a
2: b
1: c

我知道 rails 在部分内部提供了一个计数器,所以如果我想对项目进行编号我可以创建以下部分:

<%= item_counter %>: <%= item %>

这给了我

1: a
2: b
3: c

但是对于升序的数字,我需要项目的总数,我可以提供一个局部的局部:

<%= render :collection => @items, :partial => 'item', :locals => {:total => @items.size} %>

然后在部分:

<%= total - item_counter %>: <%= item %>

但在我看来,这就像重复,因为 render 方法已经知道集合的大小。

除了使用局部变量之外,真的没有办法在部分中获取集合的项目总数吗?

4

2 回答 2

20

从 Rails 版本 4.2 开始,以下是可能的:

在部分内部,您可以访问一个名为collection_iteration. 打电话collection_iteration.size会给你总数。

变更日志

#{template_name}_iteration使用集合渲染局部变量时,迭代对象可用作局部变量 。

它可以访问size被迭代的集合,当前index和两个方便的方法first?last?.

于 2012-11-15T20:50:54.953 回答
1

啊。想回答问题。但找到了正确答案。无论如何,这里是关于未来的提示。您可以使用 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 %>
于 2020-09-23T20:08:58.010 回答