我正在尝试为rails中的表设置逻辑。基本上它的时间表应用程序和我想要做的是设置它显示它显示绿色,如果你达到目标。黄色,如果你几乎在那里。如果你甚至没有接近,那就是红色。我下面的代码有效。然而,看着我的日志,它看起来非常低效。我怎么能写得更好?
这是观点。用户/ hours.html.erb
<div class="page-header"><h1>Weekly Timesheets</h1></div>
<table class="nicetable table-condensed">
<thead>
<tr>
<th>Name</th>
<th>Email</th>
<th>Total Hours</th>
<th>Role</th>
<th>Change Role</th>
<th>Timesheet</th>
</tr>
</thead>
<tbody>
<% @users.each do |user| %>
<tr class="<%= 'success' if user.has_role? :staff and user.add_hours >= 10 %><%= 'warning' if user.has_role? :staff and user.add_hours < 10 and user.add_hours > 6 %><%= 'error' if user.has_role? :staff and user.add_hours >= 0 and user.add_hours <= 6 %><%= 'success' if user.has_role? :new_staff and user.add_hours >= 15 %><%= 'warning' if user.has_role? :new_staff and user.add_hours < 15 and user.add_hours >= 12 %><%= 'error' if user.has_role? :new_staff and user.add_hours < 12 and user.add_hours >= 0 %>">
<td><%= user.name%></td>
<td><%= user.email %></td>
<td><%= user.add_hours %></td>
<td><%= user.roles.first.name.titleize unless user.roles.first.nil? %></td>
<td>
<a data-toggle="modal" href="#role-options-<%= user.id %>" class="btn btn-mini" type="button">Change role</a>
<%= render user %>
</td>
<td><%= link_to 'Timesheet', user_timesheets_path(user, @timesheets), class: "btn btn-mini" %>
</tr>
这是我的用户模型。
def add_hours
self.timesheets.where('day BETWEEN ? AND ?', Date.today.beginning_of_week, Date.today.end_of_week).order('created_at DESC').sum{|p| p.teacher + p.conversation + p.study}
end
答案 0 :(得分:1)
什么dax说的是正确的,但请不要把那些代码放在你的模型中。 您可以使用演示者模式或装饰器模式。我找到了draper gem 非常有用。 在您的情况下,您将创建一个用户装饰器,其中包含专门为此视图返回数据的所有方法。类似的东西:
class UserDecorator < Draper::Decorator
delegate_all
def role_name
object.roles.first.name.titleize if object.roles.first.present?
end
def hours_stauts
if object.add_hours >= hours_success
'success'
elsif object.add_hours >= hours_warning
'warning'
else
'error'
end
end
def hours_success
object.has_role? :staff ? 10 : 15
end
def hours_warning
object.has_role? :staff ? 6 : 12
end
end
您可以添加此视图或其他视图所需的任何方法。阅读draper文档,了解如何使用gem。
答案 1 :(得分:1)
这是重构版本。我做了以下更改:
首先是观点。我只包含了tbody中的内容:
<% for user in @users %>
<tr class="<%= user.progress_status.to_s %>">
<td><%= user.name %></td>
<td><%= user.email %></td>
<td><%= user.total_hours %></td>
<td><%= user.roles.first and user.roles.first.name.titleize %></td>
<td>
<a data-toggle="modal" href="#role-options-<%= user.id %>" class="btn btn-mini" type="button">Change role</a>
<%= render user %>
</td>
<td><%= link_to 'Timesheet', user_timesheets_path(user, @timesheets), class: "btn btn-mini" %></td>
</tr>
<% end %>
重构的用户模型方法:
def total_hours
@total_hours ||= timesheets
.where('day BETWEEN ? AND ?', Date.today.beginning_of_week, Date.today.end_of_week)
.sum {|p| p.teacher + p.conversation + p.study}
end
def progress_status
if has_role? :staff
if total_hours >= 10
:success
elsif (7..9).include? total_hours
:warning
else
:error
end
elsif has_role? :new_staff
if total_hours >= 15
:success
elsif (12..14).include? total_hours
:warning
else
:error
end
end
end
您可以使用最后一个方法(当提供更多上下文时)更进一步,但现在应该没问题。
答案 2 :(得分:0)
我认为这应该有效!
在user.rb
:
def user_css
if self.has_role? :staff do |staff|
if staff.add_hours >= 10
'success'
elsif staff.add_hours >= 6
'warning'
else
'error'
end
if self.has_role? :new_staff do |new_staff|
if new_staff.add_hours >= 15
'success'
elsif new_staff.add_hours >= 12
'warning'
else
'error'
end
end
在view
<% @users.each do |user| %>
<tr class="<%= user.user_css %>">
...
</tr>
<% end %>