
[英]Ruby on Rails: params is nil. 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.