【问题标题】:Rails Odd Even If StatementRails Odd Even If 语句
【发布时间】:2012-08-20 19:33:54
【问题描述】:

我的 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 %>  

我想创建一个之字形效果,所以我需要为每个偶数活动重新排列 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>

有没有办法用 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 %>

【问题讨论】:

    标签: ruby-on-rails dom


    【解决方案1】:

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

    1. 第一个也是最好的方法是使用 CSS 的 nth-child 选择器,假设可以完全通过 CSS 实现您想要的效果。使用nth-child(odd)nth-child(even),如Alternate table row color using CSS?中所述

    2. 如果您使用.each 遍历集合,您可以添加.with_index 并检查索引是奇数还是偶数:

      <% @activities.each.with_index do |activity, index| %>
        <% if index.odd? %>
          ...
        <% else %>
          ...
        <% end %>
      <% end %>
      

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

      <% @activities.each.with_index(1) do |activity, index| %>
      
    3. 使用 with_index 的替代方法是使用 Rails 的 cycle 帮助器,它“神奇地”在每次调用时轮流返回下一个参数:

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

    还要注意,这是重构的绝佳机会。您应该将两个重用的cell div 提取到它们自己的部分中,并按照您想要的顺序呈现它们:

    <% if index.odd? %>
      <%= render h4_part %>
      <%= render img_part %>
    <% else %>
      <% render img_part %>
      <% render h4_part %>
    <% end %>
    

    【讨论】:

    • 或者你可以对奇数和偶数 div 使用相同的 html,但要解决 css 中的 zig-zag,也可以使用循环技巧来设置 div 的类。
    • @niels 这将是我的首选解决方案
    • @niels 我已经尝试了一个小时来解决 CSS 的问题。我使用的是 nth-child,但这与 IE 不兼容。我尝试使用 table-header-row 翻转 div,但是我无法将它们向左浮动。
    • 如果你想使用 css 然后使用 meagar 的 cycle 方法添加 class="odd" 或 class="even" 到每一行,也将类名从 "cell" 更改为 "图像单元”和“信息单元”(或其他东西)。然后在你的css中你可以做类似.odd .image-cell {float: left;} .odd .info-cell {float: right;}.even .image-cell {float: right;} .even .info-cell {float: left;}
    猜你喜欢
    • 2013-08-07
    • 2018-12-04
    • 1970-01-01
    • 1970-01-01
    • 2022-01-26
    • 1970-01-01
    • 1970-01-01
    • 2022-01-05
    • 1970-01-01
    相关资源
    最近更新 更多