while循环中的实例变量

时间:2014-06-19 06:09:51

标签: ruby-on-rails ruby twitter-bootstrap

我有一个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语句时,它会输出正确的文本;但是当我加载页面时,唯一通过的类名是“危险”。

我希望逻辑能够工作,所以如果其中一个证书是警告或危险,它会退出循环并转移到下一个用户。我们的想法是,如果用户有证书,他们应该被标记为危险或警告类,否则他们应该被标记为成功类。

我是否可以在模型中定义变量并为其赋值,而不是尝试传递实例变量?

1 个答案:

答案 0 :(得分:1)

Helper

根据评论,您最好将类设置为循环的一部分(可能使用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

您可能还需要考虑的是变量的scoping。如果您在循环中设置变量,通常情况下它们将无法在其外部使用(同样,如果您在函数/方法中设置等)。

虽然我不确定instance variables的具体内容,但范围界定的想法在所有编程语言中都非常一致;你最好阅读它的含义