我有一个Ruby on Rails应用程序,我用它来显示一些认证日期。我的表行设置如下:
<tr class='<%= @row_class %>'>data_goes_here</tr>
我正在使用此代码:
@trainings.each do |training|
%w{drivers_license a_plus network_plus server_plus}.each do |field_name|
if training[field_name] < 45.days.from_now
if training[field_name] < 15.days.from_now
@row_class = 'danger'
break
else
@row_class = 'warning'
break
end
elsif training[field_name] > 45.days.from_now && !@row_class
@row_class = 'success'
end
end
end
将实例变量设置为Twitter Bootstrap类名,对应于认证到期之前剩余的时间。当我在每个循环结束时运行puts语句时,它会输出正确的文本;但是当我加载页面时,唯一通过的类名是“危险”。
我希望逻辑能够工作,所以如果其中一个证书是警告或危险,它会退出循环并转移到下一个用户。我们的想法是,如果用户有证书,他们应该被标记为危险或警告类,否则他们应该被标记为成功类。
我是否可以在模型中定义变量并为其赋值,而不是尝试传递实例变量?
答案 0 :(得分:1)
根据评论,您最好将类设置为循环的一部分(可能使用helper
方法):
#app/helpers/application_helper.rb
Class ApplicationHelper
def set_class(field_name, class= "success")
%w{drivers_license a_plus network_plus server_plus}.each do |field_name|
case training[field_name]
when < 45.days.from_now
class_name = 'warning'
when < 15.days.from_now
class_name = 'danger'
end
end
return class_name
end
end
#app/views/controller/your_view.html.erb
<% @trainings.each do |training| %>
<tr class='<%= set_class training %>'>data_goes_here</tr>
<% end %>
-
您可能还需要考虑的是变量的scoping
。如果您在循环中设置变量,通常情况下它们将无法在其外部使用(同样,如果您在函数/方法中设置等)。
虽然我不确定instance variables
的具体内容,但范围界定的想法在所有编程语言中都非常一致;你最好阅读它的含义