簡體   English   中英

NoMethodError(nil:NilClass 的未定義方法 `<'):

[英]NoMethodError (undefined method `<' for nil:NilClass):

這是我收到的錯誤:

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

非常感謝!!!

請記住, (幾乎)一切都是 Ruby 是一個對象......包括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+ 的安全導航操作符( &. ) —— 但是使用像<這樣的操作符<

channel.currency_obj.withdraw_limit&. < @local_sum

注意:在這個例子中,表達式的計算結果為nil並且因為nil是假的,條件將返回假。

或者,我們可以在我們的條件中添加另一個表達式來檢查nil

!@verified && channel.currency_obj.withdraw_limit && channel.currency_obj.withdraw_limit < @local_sum

channel.currency_obj.withdraw_limit返回nil@local_sum為 nil 時發生錯誤。

它無法比較nil值。

您必須再次檢查@local_sum ,並確保它具有值。 或者channel.currency_obj.withdraw_limit確保它有一個值。

但我猜channel.currency_obj.withdraw_limit返回nil

那是你的問題。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM