在Rails 3中干,如果没有elsif

bla*_*ges 1 ruby-on-rails ruby-on-rails-3

第二周RoR(没有编程背景).我有一个问题,我正在做Metacritic类型的网站.到处都会有收视率.我决定0到33 =红色34到66 =橙色67到100 =绿色看起来像那样

索引(控制器:显示)

 <td><% if show.reviews.count == 0 %>0
    <% elsif show.reviews.average("rating").between?(33, 66) %>
    <table class="orange">
      <tr>
        <td><b><%= number_with_precision(show.reviews.average("rating"), :precision => 0) %></b></td>
     </tr>
    </table>
    <% elsif show.reviews.average("rating").between?(66, 100) %>
    <table class="green">
      <tr>
        <td><%= number_with_precision(show.reviews.average("rating"), :precision => 0) %></td>
      </tr>
    </table>
    <% elsif show.reviews.average("rating").between?(00, 33) %>
    <table class="red">
      <tr>
        <td><%= number_with_precision(show.reviews.average("rating"), :precision => 0) %></td>
      </tr>
    </table>
    <% end %>
  </td>
Run Code Online (Sandbox Code Playgroud)

我的问题是,我需要重复那段代码,看看(我只是开始了:show(控制器展示)

<p>
  Note: <% if @ratings == 0 %>0
  <% elsif @ratings.between?(33, 66) %>
  <table class="orange">
    <tr>
      <td><b><%= number_with_precision(@ratings, :precision => 0) %></b></td>
    </tr>
  </table>
  <% elsif @ratings.between?(66, 100) %>
  <table class="green">
    <tr>
      <td><%= number_with_precision(@ratings, :precision => 0) %></td>
    </tr>
  </table>
  <% elsif @ratings.between?(00, 33) %>
  <table class="red">
    <tr>
      <td><%= number_with_precision(@ratings, :precision => 0) %></td>
    </tr>
  </table>
  <% end %>
</p>
Run Code Online (Sandbox Code Playgroud)

有人告诉我这应该是一个模型,但我真的不知道如何写它.有帮助吗?

Mis*_*cha 5

首先,您应该为Show模型添加一个实例方法,以检索并缓存节目的平均评级.这可以防止对同一数据多次查询数据库:

def average_rating
  @average_rating ||= self.reviews.average('rating')
end
Run Code Online (Sandbox Code Playgroud)

返回适当的css类的代码Show可以进入帮助程序(例如ShowHelper):

module ShowHelper
  def average_rating_class_for(show)
    if show.average_rating < 34
      'red'
    elsif show.average_rating > 66
      'green'
    else
      'orange'
    end
  end
end
Run Code Online (Sandbox Code Playgroud)

有了这个,您的观点变得更加清晰:

<td>
<% if show.reviews.count == 0 %>
  0
<% else %>
  <table class="<%= average_rating_class_for(show) %>">
    <tr>
      <td><%= number_with_precision(show.average_rating, :precision => 0) %></td>
    </tr>
  </table>
<% end %>
</td>
Run Code Online (Sandbox Code Playgroud)

和:

<p>
  Note:
<% if @show.reviews.count == 0 %>
  0
<% else %>
  <table class="<%= average_rating_class_for(@show) %>">
    <tr>
      <td><%= number_with_precision(@show.average_rating, :precision => 0) %></td>
    </tr>
  </table>
<% end %>
</p>
Run Code Online (Sandbox Code Playgroud)

您甚至可以将整个表的生成移动到模型中.(虽然你不应该在这里使用表格,但这是另一回事.)

module ShowHelper
  def average_rating_class_for(show)
    if show.average_rating < 34
      'red'
    elsif show.average_rating > 66
      'green'
    else
      'orange'
    end
  end

  def average_rating_table_for(show)
    if show.reviews.count == 0
      '0'
    else
      content_tag :table do
        content_tag :tr do
          contect_tag :td, :class => average_rating_class_for(show) do
            number_with_precision(show.average_rating, :precision => 0)
          end
        end
      end
    end
  end
end
Run Code Online (Sandbox Code Playgroud)

通过此,您可以查看:

<td>
  <%= average_rating_table_for(show) %>
</td>
Run Code Online (Sandbox Code Playgroud)

安德烈建议的也是可能的,但对于像你这样的初学者来说可能有点难以理解.这更简单.