【问题标题】:Rails: Render collection partial: Getting size of collection inside partialRails:渲染集合部分:获取部分内部集合的大小
【发布时间】:2012-11-15 12:49:42
【问题描述】:

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

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

但对我来说感觉像是重复,因为渲染方法已经知道集合的大小。

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

【问题讨论】:

  • 没有。 See for yourself
  • 我看了看那里,但我觉得我错过了什么。

标签: ruby-on-rails


【解决方案1】:

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

在部分内部,您可以访问名为collection_iteration 的函数/变量。致电collection_iteration.size 即可获得总数。

来自changelog

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

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

【讨论】:

  • 不,部分中没有可用的collection。至少在 Rails 3.2.6 中没有。您是从哪里获得这些信息的?
  • 我是从以下来源获得的:github.com/rails/rails/blob/…
  • 在发布答案之前,我还在我的工作申请中进行了测试。我可能会在星期二检查它的 Rails 版本,但它确实有效。
  • 如果这行得通就好了,但我还不知道怎么做。
  • 看来pull request还没有合并,而是安排在Rails 4.2.0:github.com/rails/rails/pull/7698
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-10-22
    • 1970-01-01
    • 2023-03-13
    • 2016-04-24
    • 2014-12-22
    • 2013-03-24
    • 2013-03-24
    • 1970-01-01
    相关资源
    最近更新 更多