繁体   English   中英

params[…] 比较在 ruby​​ on rails 中引发了“undefined method `>' for nil:NilClass”错误

[英]params[…] comparison raises “undefined method `>' for nil:NilClass” error in ruby on rails

我想在下面检查:

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

但它给了我以下错误:

undefined method `>' for nil:NilClass

如何在 ruby​​ on rails 中检查上述条件?

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

可能正确的是:

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

从 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值,请记住这一点。

&. 表示仅在前导对象不为空时才调用尾随方法。 它在链式方法调用中更有意义,例如:

user&.deactivate!

但是,由于大于号运算符>实际上是Ruby 中的一个方法,因此它也可以在这里使用。

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

试试这个代码

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

重新阅读这个问题,我意识到我错过了第一个答案的标记。 它回避了这个问题而没有解决它。

你看到这个错误的真正问题是你可能把! 在错误的地方。

如果你的意思是, 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)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2025 STACKOOM.COM