如何检查轨道上红宝石的大于和小于条件'

时间:2014-03-26 11:41:19

标签: ruby-on-rails

我想查看以下内容:

if params[:hidval] > "0"
OR
if !params[:hidval] < "1"

但它在下面给了我错误:

undefined method `>' for nil:NilClass

如何检查轨道上红宝石的上述条件?

4 个答案:

答案 0 :(得分:7)

错误消息说明了一切。确保,param确实存在。您尝试将任何内容(NilClass)与数字进行比较。 (这实际上是一个字符串,这将是你的下一个问题)

可能正确的是:

if params[:hidval].present? && params[:hidval] > 0
 # Do something ...
end

答案 1 :(得分:2)

试试此代码

if params[:hidval].present?
  if params[:hidval].to_i > 0
    # Greater than 0 condition
  else
    # Less than equal to 0 condition
  end
end

答案 2 :(得分:2)

从Ruby 2.3开始,您可以使用安全导航操作符&.来简化此操作:

irb(main):028:0>   5 > 0
=> true
irb(main):029:0> nil > 0
NoMethodError: undefined method '>' for nil:NilClass
    from (irb):29
irb(main):030:0>   5 &.> 0
=> true
irb(main):031:0> nil &.> 0
=> nil
irb(main):032:0>   5 &.> 99
=> false

这通常会为您提供所需的内容(例如条件分支),因为nil是错误的。但是请记住,如果您实际上依赖确切的false值。

&.意味着仅在前导对象不为null时才调用尾随方法。在像这样的链接方法调用中,它更有意义:

user&.deactivate!

但是,由于大于运算符>实际上是Ruby中的方法,因此它在这里也能正常工作。

就我个人而言,我不相信params[:hidval] &.> "0"的痛苦美感使这值得...但那只是风格问题。

答案 3 :(得分:0)

重新阅读此问题,我意识到我错过了第一个答案的分数。它回避了问题,但没有解决。

您看到此错误的真正问题是您可能将!放在错误的位置。

如果您的意思是if it is not less than "1",则应输入:

if !( params[:hidval] < "1" )

这将比较hidval和“ 1”,然后对结果求反。

您发布的内容:

if !params[:hidval] < "1"

...首先对hidval求反(通常导致false),然后比较false(或可能为true)以查看其是否小于“ 1”。将false与字符串进行比较不仅没有多大意义,而且实际上还会出现此错误:

NoMethodError (undefined method `<' for false:FalseClass)