Rails奇怪,即使声明

col*_*ite 5 dom ruby-on-rails

我的Activity模型有一个循环

<% @activities.each do |activity| %>
<div>
    <div class="cell">
        <%= image_tag(activity.image) %>
    </div>
    <div class="cell">
        <h4><%= activity.title %></h4>
        <p><%= activity.description %></p>
        <span><%= activity.distance %></span>
    </div>
</div>
<% end %>  
Run Code Online (Sandbox Code Playgroud)

我想创建一个zig-zag效果,所以我需要为每个偶数活动重新安排HTML,所以标记将如下所示:

<div>
  <div class="cell">
    <h4><%= activity.title %></h4>
    <p><%= activity.description %></p>
    <span><%= activity.distance %></span>
  </div>
  <div class="cell">
    <%= image_tag(activity.image) %>
  </div>
</div>
Run Code Online (Sandbox Code Playgroud)

有没有办法用if语句做到这一点?像这样的东西:

<% if activity.odd? %>
 <% @activities.each do |activity| %>
   <div>
     <div class="cell">
   <%= image_tag(activity.image) %>
 </div>
 <div class="cell">
   <h4><%= activity.title %></h4>
   <p><%= activity.description %></p>
   <span><%= activity.distance %></span>
 </div>
   </div>
  <% end %>
<% else %>
  <% @activities.each do |activity| %>
    <div>
      <div class="cell">
    <h4><%= activity.title %></h4>
    <p><%= activity.description %></p>
    <span><%= activity.distance %></span>
  </div>
  <div class="cell">
    <%= image_tag(activity.image) %>
      </div>
</div>
<% end %>
Run Code Online (Sandbox Code Playgroud)

mea*_*gar 14

有几种方法可以做到这一点.

  1. 第一种也是最好的方法是使用CSS的nth-child选择器来做这件事,假设它可以纯粹通过CSS实现你想要的效果.使用nth-child(odd)nth-child(even),如使用CSS的备用表行颜色中所述?

  2. 如果您正在迭代使用的集合.each,您可以添加.with_index并检查索引是奇数还是偶数:

    <% @activities.each.with_index do |activity, index| %>
      <% if index.odd? %>
        ...
      <% else %>
        ...
      <% end %>
    <% end %>
    
    Run Code Online (Sandbox Code Playgroud)

    请注意,默认情况下,索引从零开始,因此您的第一个元素将被视为"偶数".您可以将起始索引传递给1,with_index如果您希望交替开始奇数:

    <% @activities.each.with_index(1) do |activity, index| %>
    
    Run Code Online (Sandbox Code Playgroud)
  3. 使用的另一种方法with_index是使用Rails的cycle帮助程序,每次调用它时,它会"神奇地"返回循环中的下一个参数:

    <% @activities.each do |activity| %>
      <% if cycle('odd', 'even') == 'odd' %>
        ...
      <% end %>
    <% end %>
    
    Run Code Online (Sandbox Code Playgroud)

另请注意,这是重构的绝佳机会.你应该将两个重复使用的celldiv 提炼成它们自己的部分并按你想要的顺序渲染它们:

<% if index.odd? %>
  <%= render h4_part %>
  <%= render img_part %>
<% else %>
  <% render img_part %>
  <% render h4_part %>
<% end %>
Run Code Online (Sandbox Code Playgroud)