[英]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
有問題的錯誤在這個文件中:
非常感謝!!!
請記住, (幾乎)一切都是 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.