NoMethodError(nil:NilClass的未定义方法“ <”):

时间:2019-03-26 01:41:57

标签: ruby-on-rails rubygems

这是我收到的错误:

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

有问题的错误在此文件中:

https://github.com/DigitalCoin1/Spero-Exchange/blob/rebuild-peatio/app/controllers/concerns/withdraws/withdrawable.rb

非常感谢!!

3 个答案:

答案 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