簡體   English   中英

Ruby Undefined方法downcase

[英]Ruby Undefined method downcase

我在下面的代碼中得到了一個例外。 有人可以告訴我我做錯了什么,以及如何防止它?

def self.find_by_data(data = {})
            where(name_canonical: data['name'].downcase.gsub(/\s+/, ''),
                  fuel:           data['fuel'],
                  trim_canonical: data['trim'].downcase.gsub(/\s+/, ''),
                  year:           data['year']).first
        end

例外:

/Users/charlie/Documents/WIP/projectx/ar_models.rb:35:in `find_by_data': undefined method `downcase' for nil:NilClass (NoMethodError)ooooooooooooooooooooooooo| ETA:   0:00:00
    from /Users/charlie/.rvm/gems/ruby-2.0.0-p0/gems/activerecord-4.0.0/lib/active_record/relation/delegation.rb:36:in `block in find_by_data'
    from /Users/charlie/.rvm/gems/ruby-2.0.0-p0/gems/activerecord-4.0.0/lib/active_record/associations/collection_proxy.rb:845:in `block in scoping'
    from /Users/charlie/.rvm/gems/ruby-2.0.0-p0/gems/activerecord-4.0.0/lib/active_record/relation.rb:270:in `scoping'
    from /Users/charlie/.rvm/gems/ruby-2.0.0-p0/gems/activerecord-4.0.0/lib/active_record/associations/collection_proxy.rb:845:in `scoping'
    from /Users/charlie/.rvm/gems/ruby-2.0.0-p0/gems/activerecord-4.0.0/lib/active_record/relation/delegation.rb:36:in `find_by_data'
    from /Users/charlie/Documents/WIP/projectx/ar_models.rb:132:in `create_or_assign_existing'
    from /Users/charlie/Documents/WIP/projectx/app.rb:230:in `block (2 levels) in work'
    from /Users/charlie/.rvm/gems/ruby-2.0.0-p0/gems/activerecord-4.0.0/lib/active_record/connection_adapters/abstract/connection_pool.rb:294:in `with_connection'
    from /Users/charlie/Documents/WIP/projectx/app.rb:80:in `block in work'
    from /Users/charlie/.rvm/gems/ruby-2.0.0-p0/gems/parallel-0.6.3/lib/parallel.rb:319:in `call'
    from /Users/charlie/.rvm/gems/ruby-2.0.0-p0/gems/parallel-0.6.3/lib/parallel.rb:319:in `call_with_index'
    from /Users/charlie/.rvm/gems/ruby-2.0.0-p0/gems/parallel-0.6.3/lib/parallel.rb:179:in `block (3 levels) in work_in_threads'
    from /Users/charlie/.rvm/gems/ruby-2.0.0-p0/gems/parallel-0.6.3/lib/parallel.rb:326:in `with_instrumentation'
    from /Users/charlie/.rvm/gems/ruby-2.0.0-p0/gems/parallel-0.6.3/lib/parallel.rb:177:in `block (2 levels) in work_in_threads'
    from /Users/charlie/.rvm/gems/ruby-2.0.0-p0/gems/parallel-0.6.3/lib/parallel.rb:171:in `loop'
    from /Users/charlie/.rvm/gems/ruby-2.0.0-p0/gems/parallel-0.6.3/lib/parallel.rb:171:in `block in work_in_threads'
    from /Users/charlie/.rvm/gems/ruby-2.0.0-p0/gems/parallel-0.6.3/lib/parallel.rb:62:in `block (2 levels) in in_threads'

當你看到“未定義的方法...對於nil:NilClass”時,它意味着你有一個nil值,你試圖調用該方法。

在這種情況下,沒有定義data['name']類的東西。

為了使這更加防彈:

data['name'].to_s.downcase.gsub(/\s+/, '')

這會將所有內容轉換為字符串以開始。 nil.to_s默認是一個空字符串,所以它是安全的。

也許使用三元運算符:

def self.find_by_data(data = {})
            where(name_canonical: data['name'] == nil ? '' : data['name'].downcase.gsub(/\s+/, ''),
                  fuel:           data['fuel'],
                  trim_canonical: data['trim'] == nil ? '' : data['name'].downcase.gsub(/\s+/, ''),
                  year:           data['year']).first
        end

你的

data['name'] 

要么

data['trim']

是一個零。 檢查輸入數據。

暫無
暫無

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

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