0

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

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

理论上,类名应该在每一行的“receipt odd”和“receipt even”之间循环。相反,我每次都会收到“奇怪的收据”。我也尝试过使用无序列表和表格,但它们也不能正常工作。知道发生了什么吗?

4

4 回答 4

3

这行不通,就像你写的那样。在您调用时调用cycle一次content_tag_for然后返回"odd"。传入的是那个值,而不是函数。除非接受一个块/lambda 作为它的参数,否则你不能做你想做的事情。"odd"content_tag_forcyclecontent_tag_forstyle

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

func1( func2() )

处理这个问题的最好方法是通过集合渲染。

在您看来:

= render conversation.receipts_for(current_user)

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

= div_for receipt, :class => cycle('odd', 'even')
  %p=receipt.content
于 2012-07-22T17:45:20.087 回答
1

我可以用更丑陋的方法来解决这个问题:

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

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

于 2012-07-22T17:39:22.530 回答
0

这是苗条的,不是haml,除了语法之外,这个概念就在那里:

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

我同意如果你在进行 Rails 开发,必须习惯局部变量,但我喜欢避免在循环中调用局部变量(用于集合)——主要是这样它不会给开发日志增加噪音,不确定性能影响一种方法与另一种方法(此处进行一些讨论)

于 2015-02-17T17:46:42.650 回答
0

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

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

对于你的情况,我会做

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

循环参考

于 2015-06-19T17:37:38.910 回答