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)
有人告诉我这应该是一个模型,但我真的不知道如何写它.有帮助吗?
首先,您应该为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)
安德烈建议的也是可能的,但对于像你这样的初学者来说可能有点难以理解.这更简单.
| 归档时间: |
|
| 查看次数: |
1784 次 |
| 最近记录: |