2012-07-16 33 views
7

Tôi nhận được một mảng lồng nhau từ facebook qua omniauth và muốn kiểm tra xem nó có trống không?/Nil?/Exist? dòng tùy chỉnh trông giống như:Làm cách nào để bắt lỗi "không xác định phương thức` [] 'cho nil: NilClass "?

unless omniauth['extra']['raw_info']['location']['name'].nil? 

Điều này nên kiểm tra xem phần này của mảng có trống hoặc tồn tại không.

Nhưng luôn lỗi này bị ném:

undefined method `[]' for nil:NilClass 

Tôi kiểm tra mảng sai?

Tôi đã thử bằng "has_key" "không?" "trống?" "tồn tại?" "chỗ trống?"

Nhưng không ai trong số này hoạt động!

Xin hãy giúp tôi, cảm ơn rất nhiều!

Trả lời

12

Lỗi này được nâng lên vì một trong các giá trị băm trong chuỗi omniauth['extra']['raw_info']['location']['name'].nil? trả về 0 và không phải là cuộc gọi cuối cùng ['name'].

Nếu ví dụ omniauth['extra']['raw_info'] trả về số không, bạn thực sự đang cố gắng gọi số nil['location'] làm phát sinh lỗi trong ruby.

Bạn có thể bắt lỗi này chỉ đơn giản là:

res = omniauth['extra']['raw_info']['location']['name'].nil? rescue true 

unless res 
    #your code here 
end 

Xin lưu ý rằng các khối mã trên sẽ lấp đầy res biến với true nếu [ 'name'] băm giá trị là con số không hoặc bất kỳ giá trị hash khác trong chuỗi trả về nil.

+0

Hi Erez, cảm ơn bạn, nhưng làm thế nào tôi có thể nói "nếu bạn là con số không ..." thực thi các dòng tiếp theo? – Jan

+0

nếu res là true - một trong các giá trị băm omniauth trả lại nil –

+0

nhiều, rất cảm ơn Erez :) – Jan

12

Lý tưởng nhất là bạn nên kiểm tra từng cấp lồng nhau để xem đó có phải là nil hay không, tuy nhiên, điều này cũng sẽ hoạt động.

unless (omniauth['extra']['raw_info']['location']['name'] rescue nil).nil? 

Bạn cũng có thể giải cứu cụ thể NoMethodError.

4

Một chút muộn để đảng, nhưng, như chỉ trong this answer, Ruby 2.3.0 introduced a new method gọi , mà sẽ trở nil nếu một trong những chìa khóa xích là nil. omniauth bạn auth băm sau đó có thể được trình bày như:

omniauth = { 
      ...     
      "extra"=>{ "raw_info"=> 
         { "location"=>"New York", 
          "gravatar_id"=>"123456789"}} 
      ... 
      } 


omniauth.dig('extra', 
      'raw_info', 
      'location', 
      'name', 
      'foo', 
      'bar', 
      'baz') #<= nil 
+1

Hoặc 'omniauth.dig (*% w [thêm tên địa chỉ raw_info foo bar baz])' nếu tất cả dấu câu bên trong khó đọc. –

Các vấn đề liên quan