简体   繁体   中英

How to add a class to a render :partial => @collection on every 4th item?

Let's say I have 16 results

On every 4th item I need to add a class "no-margin" (because every item on the left needs a margin right to create spacing but the last one doing that would break the layout, thus the need for this).

What's the best way to do this?

I have it very rails-like right now.

render :partial => @collection

_collection.html.haml
 stuff

Is there something that I can put in the partial that would solve this or would it have to happen outside?

Thanks.

When you render a collection, Rails creates an hidden index. In this case, you can combine the module with the index to obtain the result.

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

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

Even better, extract the logic into a Helper method.

Note. The name of the counter is <partial_name>_counter .

You might be able to use cycle() to do this: http://api.rubyonrails.org/classes/ActionView/Helpers/TextHelper.html#M001753

Not sure whether it would look different in haml, but in an erb template, I would do this:

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

I'd be inclined to use the each_with_index method from enumerable .

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

Your helper might look like this.

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM