如何将类添加到渲染:partial =>每四个项目@collection?

时间:2009-12-07 08:42:06

标签: ruby-on-rails

假设我有16个结果

在每4个项目上我需要添加一个类“无边距”(因为左边的每个项目需要一个边距来创建间距,但最后一个这样做会破坏布局,因此需要这个)。

最好的方法是什么?

我现在非常喜欢它。

render :partial => @collection

_collection.html.haml
 stuff

有什么东西可以放在部分中来解决这个问题,还是必须在外面发生?

感谢。

3 个答案:

答案 0 :(得分:9)

渲染集合时,Rails会创建隐藏索引。在这种情况下,您可以将模块与索引组合以获得结果。

# _partial.html.erb
<div class="<% if (partial_counter % 4) == 0 %>no-margin<% end %>">
  ...
</div>

# action
<%= render => "partial", :collection => @collection %>

更好的是,将逻辑提取到Helper方法中。

请注意。该计数器的名称为<partial_name>_counter

答案 1 :(得分:2)

您可以使用cycle()执行此操作:http://api.rubyonrails.org/classes/ActionView/Helpers/TextHelper.html#M001753

不确定它在haml中是否会有所不同,但在erb模板中,我会这样做:

<% @collection.each do |item| %>
  <tr class="<%= cycle('yes-margin', 'yes-margin', 'yes-margin', 'no-margin' %>">
      ...
  </tr>
<% end %>

答案 2 :(得分:1)

我倾向于使用each_with_index中的enumerable方法。

# app/views/questions/index.html.haml
- @questions.each_with_index do |question, index|
  %li{ :class => no_margin(index) }
    = render :partial => 'question', :object => question

你的助手可能看起来像这样。

# app/helpers/questions_helper.rb
def no_margin(index)
  index % 4 == 0 ? 'no-margin' : 'margin'
end