【问题标题】:Instance variables in a while loopwhile循环中的实例变量
【发布时间】:2014-08-09 14:11:30
【问题描述】:

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

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

我是否应该在模型中定义一个变量并为其赋值,而不是尝试通过实例变量?

【问题讨论】:

  • 为什么不在你的视图中使用条件类,比如stackoverflow.com/a/2626946/2563282
  • 在每个循环中,您都在重置实例变量。所以在视图中,它将设置最后一个值。
  • 这就是我注意到的;如何在每个循环中将单个变量传递给模型?
  • 可以在视图文件中添加循环吗?
  • 我在视图中有循环,但它真的很混乱。正在尝试遵循一些最佳实践并将逻辑移出视图,但将其移回可能是最简单的。

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


【解决方案1】:

Helper

根据 cmets,您最好将类设置为循环的一部分(可能使用 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 的具体细节,但范围界定的想法在所有编程语言中都相当一致;你最好阅读它的含义

【讨论】:

  • 这个让我陷入了一个循环,直到盯着它意识到类是一个受保护的变量名。将其更改为 class_name,它在 case 语句中给了我一个错误。最后回到 if/then/else 语句,效果很好!感谢您提供有关范围界定的提示;虽然我对其他语言很熟悉,但可能不如我希望的那么流利。谢谢!
猜你喜欢
  • 1970-01-01
  • 2022-07-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-07
  • 2013-03-26
  • 2011-05-24
相关资源
最近更新 更多