这是我收到的错误:
NoMethodError (undefined method `<' for nil:NilClass):
app/controllers/concerns/withdraws/withdrawable.rb:20:in `create'
这是相关代码的一部分:
def create
@withdraw = model_kls.new(withdraw_params)
@verified = current_user.id_document_verified?
@local_sum = params[:withdraw][:sum]
if !@local_sum
render text: I18n.t('private.withdraws.create.amount_empty_error'), status: 403
return
end
if !@verified && channel.currency_obj.withdraw_limit < @local_sum <<<<<- Here is the error
render text: I18n.t('private.withdraws.create.unverified_withdraw_limit_error', limit: channel.currency_obj.withdraw_limit), status: 403
return
end
那是我的全部代码:
https://github.com/DigitalCoin1/Spero-Exchange
有问题的错误在此文件中:
非常感谢!!
答案 0 :(得分:2)
请记住,(almost) everything is Ruby is an object ...包括nil
。
请记住,请考虑当您调用nil
上不存在的方法时会发生什么:
irb(main):001:0> nil.something
Traceback (most recent call last):
2: from /Users/scott/.rbenv/versions/2.5.1/bin/irb:11:in `<main>'
1: from (irb):1
NoMethodError (undefined method `something' for nil:NilClass)
此外,在Ruby运算符中,例如>
,<
和==
实际上是方法调用。因此,例如,Integer
的一个实例(例如3
)上定义了一个名为<
的方法,当您调用3 < 4
时,该方法将在该实例上调用该方法。这样工作是因为在Ruby中,您可以在进行方法调用时省略括号。例如:
irb(main):001:0> 3 < 4
=> true
irb(main):002:0> 3.<(4)
=> true
因此将这两个示例放在一起:
irb(main):014:0> nil < 4
Traceback (most recent call last):
2: from /Users/scott/.rbenv/versions/2.5.1/bin/irb:11:in `<main>'
1: from (irb):14
NoMethodError (undefined method `<' for nil:NilClass)
现在,让我们看一下您的代码。
您遇到了例外情况:
NoMethodError (undefined method `<' for nil:NilClass)
在这一行:
!@verified && channel.currency_obj.withdraw_limit < @local_sum
查看此代码,您仅在一个位置调用<
。这意味着它左边的任何内容(channel.currency_obj.withdraw_limit
都必须是nil
。
有几种方法可以解决此问题……(我认为)最好的方法是确保channel.currency_obj
永远不会是nil
。不幸的是,我没有足够的代码来告诉您确切的操作方法,所以让我们看一下其他一些选择...
我们可以使用Ruby 2.3+'s safe navigation operator(&.
),但是与<
之类的运算符一起使用有点奇怪。
channel.currency_obj.withdraw_limit&. < @local_sum
注意:在本示例中,表达式的计算结果为nil
,并且由于nil
为false,因此条件语句将返回false。
或者,我们可以在条件中添加另一个表达式以检查nil
:
!@verified && channel.currency_obj.withdraw_limit && channel.currency_obj.withdraw_limit < @local_sum
答案 1 :(得分:0)
当channel.currency_obj.withdraw_limit
返回nil
或@local_sum
为nil时发生错误。
它无法比较nil
的值。
您必须再次检查@local_sum
,并确保它具有值。或channel.currency_obj.withdraw_limit
确保它具有值。
但是我想channel.currency_obj.withdraw_limit
返回nil
。
那是你的问题。
答案 2 :(得分:0)
NoMethodError (undefined method `<' for nil:NilClass):
app/controllers/concerns/withdraws/withdrawable.rb:20:in `create'
此错误表示它正在尝试将<
与nil
的值进行比较。
您能否print
并在错误声明之前检查channel.currency_obj.withdraw_limit
和@local_sum
。
为避免出现nil
错误,您可以添加nil check
。
if channel.currency_obj.withdraw_limit != nil and @local_sum != nil