Rails:每次循环产生相同的结果

时间:2012-07-22 16:13:50

标签: ruby-on-rails cycle

我正在尝试使用以下代码创建斑马条纹系列div:

= content_tag_for(:div, conversation.receipts_for(current_user), :class => cycle("odd", "even")) do |receipt|
  %p=receipt.content

理论上,类名应在每行的“收据奇数”和“收货均匀”之间循环。相反,我每次都得到“收据奇怪”。我也尝试过使用无序列表和表格,但它们也无法正常工作。知道发生了什么事吗?

4 个答案:

答案 0 :(得分:3)

这不可行,就像你写的那样。在您致电cycle时,content_tag_for被称为一次,并返回"odd""odd",传递到content_tag_for函数cycle。除非content_tag_for接受style参数的块/ lambda,否则你无法做你想做的事。

本质上,你正在调用一个函数并传入第二个函数的返回值

func1( func2() )

处理此问题的最佳方法是通过集合渲染。

在您看来:

= render conversation.receipts_for(current_user)

在单独的部分中,可能是app/views/receipts/_receipt.html.haml

= div_for receipt, :class => cycle('odd', 'even')
  %p=receipt.content

答案 1 :(得分:1)

我能够让这个有点丑陋:

-conversation.receipts_for(current_user).each do |receipt|
  %div{:class => cycle("receipt odd", "receipt even")}
    %p=receipt.content

如果有人找到更优雅的解决方案,请告诉我。

答案 2 :(得分:0)

除了简洁,而不是haml,语法之外,概念就在那里:

= div_for(conversation.receipts_for(current_user)) do |receipt|
  p class=cycle("odd", "even")
    = receipt.content.try(:html_safe)

我同意,如果你正在进行Rails开发,习惯于部分是必须的,但我喜欢避免在循环中调用partials(对于集合) - 大多数情况下它不会给开发日志添加噪声,不确定一种方法与另一种方法的性能影响(一些讨论here

答案 3 :(得分:0)

您应该为周期添加名称。如果在同一个程序段中有两个循环而没有名称,它们将相互循环并产生相同的结果。

help for

对于你的情况,我会做

cycle("odd", "even", name: "cycle_name")

Cycle Reference