2012-02-25 26 views
22

Vì một số lý do tôi bắt đầu gặp lỗi này sau khi chuyển sang Rails 3.2. Tôi đoán nó có một cái gì đó để làm với plugin acl9, mà tôi đã cố gắng cài đặt lại, nhưng không có gì thay đổi.Rails 3.2 undefined method `key? ' cho nil: NilClass

Tôi đã chuyển các plugin thành lib/plugins và thêm trình khởi tạo vào cấu hình/trình khởi tạo nhưng lại một lần nữa, cùng một lỗi.

Tôi đã tìm giải pháp tại repo acl9 trên Github, nhưng không thể tìm thấy bất kỳ thứ gì ở đó. Có lẽ nó không phải là acl9 sau khi tất cả.

Tôi có kẹp giấy, acl9, được cài đặt tự động.

NoMethodError (undefined method `key?' for nil:NilClass): 
actionpack (3.2.1) lib/action_controller/metal/hide_actions.rb:36:in `visible_action?' 
actionpack (3.2.1) lib/action_controller/metal/hide_actions.rb:18:in `method_for_action' 
actionpack (3.2.1) lib/action_controller/metal/implicit_render.rb:14:in `method_for_action' 
actionpack (3.2.1) lib/action_controller/metal/compatibility.rb:61:in `method_for_action' 
actionpack (3.2.1) lib/abstract_controller/base.rb:115:in `process' 
actionpack (3.2.1) lib/abstract_controller/rendering.rb:45:in `process' 
actionpack (3.2.1) lib/action_controller/metal.rb:203:in `dispatch' 
actionpack (3.2.1) lib/action_controller/metal/rack_delegation.rb:14:in `dispatch' 
actionpack (3.2.1) lib/action_controller/metal.rb:246:in `block in action' 
actionpack (3.2.1) lib/action_dispatch/routing/route_set.rb:66:in `call' 
actionpack (3.2.1) lib/action_dispatch/routing/route_set.rb:66:in `dispatch' 
actionpack (3.2.1) lib/action_dispatch/routing/route_set.rb:30:in `call' 
journey (1.0.3) lib/journey/router.rb:68:in `block in call' 
journey (1.0.3) lib/journey/router.rb:56:in `each' 
journey (1.0.3) lib/journey/router.rb:56:in `call' 
actionpack (3.2.1) lib/action_dispatch/routing/route_set.rb:589:in `call' 
actionpack (3.2.1) lib/action_dispatch/middleware/best_standards_support.rb:17:in `call' 
rack (1.4.1) lib/rack/etag.rb:23:in `call' 
rack (1.4.1) lib/rack/conditionalget.rb:25:in `call' 
actionpack (3.2.1) lib/action_dispatch/middleware/head.rb:14:in `call' 
actionpack (3.2.1) lib/action_dispatch/middleware/params_parser.rb:21:in `call' 
actionpack (3.2.1) lib/action_dispatch/middleware/flash.rb:242:in `call' 
rack (1.4.1) lib/rack/session/abstract/id.rb:205:in `context' 
rack (1.4.1) lib/rack/session/abstract/id.rb:200:in `call' 
actionpack (3.2.1) lib/action_dispatch/middleware/cookies.rb:338:in `call' 
activerecord (3.2.1) lib/active_record/query_cache.rb:64:in `call' 
activerecord (3.2.1) lib/active_record/connection_adapters/abstract/connection_pool.rb:443:in `call' 
actionpack (3.2.1) lib/action_dispatch/middleware/callbacks.rb:28:in `block in call' 
activesupport (3.2.1) lib/active_support/callbacks.rb:405:in `_run__3140920687338355213__call__3168118505970967148__callbacks' 
activesupport (3.2.1) lib/active_support/callbacks.rb:405:in `__run_callback' 
activesupport (3.2.1) lib/active_support/callbacks.rb:385:in `_run_call_callbacks' 
activesupport (3.2.1) lib/active_support/callbacks.rb:81:in `run_callbacks' 
actionpack (3.2.1) lib/action_dispatch/middleware/callbacks.rb:27:in `call' 
actionpack (3.2.1) lib/action_dispatch/middleware/reloader.rb:65:in `call' 
actionpack (3.2.1) lib/action_dispatch/middleware/remote_ip.rb:31:in `call' 
actionpack (3.2.1) lib/action_dispatch/middleware/debug_exceptions.rb:16:in `call' 
actionpack (3.2.1) lib/action_dispatch/middleware/show_exceptions.rb:56:in `call' 
railties (3.2.1) lib/rails/rack/logger.rb:26:in `call_app' 
railties (3.2.1) lib/rails/rack/logger.rb:16:in `call' 
actionpack (3.2.1) lib/action_dispatch/middleware/request_id.rb:22:in `call' 
rack (1.4.1) lib/rack/methodoverride.rb:21:in `call' 
rack (1.4.1) lib/rack/runtime.rb:17:in `call' 
activesupport (3.2.1) lib/active_support/cache/strategy/local_cache.rb:72:in `call' 
rack (1.4.1) lib/rack/lock.rb:15:in `call' 
actionpack (3.2.1) lib/action_dispatch/middleware/static.rb:53:in `call' 
railties (3.2.1) lib/rails/engine.rb:479:in `call' 
railties (3.2.1) lib/rails/application.rb:220:in `call' 
rack (1.4.1) lib/rack/content_length.rb:14:in `call' 
railties (3.2.1) lib/rails/rack/log_tailer.rb:14:in `call' 
rack (1.4.1) lib/rack/handler/webrick.rb:59:in `service' 
/Users/project/.rvm/rubies/ruby-1.9.3-p0/lib/ruby/1.9.1/webrick/httpserver.rb:138:in `service' 
/Users/project/.rvm/rubies/ruby-1.9.3-p0/lib/ruby/1.9.1/webrick/httpserver.rb:94:in `run' 
/Users/project/.rvm/rubies/ruby-1.9.3-p0/lib/ruby/1.9.1/webrick/server.rb:191:in `block in start_thread' 

CHỈNH SỬA (GIẢI PHÁP): Phải mất một lúc để hiểu và tôi vẫn chưa chắc điều gì đã xảy ra. Tôi nghĩ rằng nó đã làm với sự hỗ trợ của acl9 cho Rails 3.1+ Nhưng cuối cùng tôi lấy mã acl9 từ github và tất cả mọi thứ đột nhiên bắt đầu làm việc.

Trả lời

16

Tôi là một newbie để RoR và có những lỗi tương tự khi đi qua RoR "Hướng dẫn bắt đầu".

này nghe có vẻ ngớ ngẩn, nhưng những người khác có thể mắc phải sai lầm giống như tôi, vì vậy đăng những gì tôi nhận thấy trong RoR từ mắt người mới của,

validates :name, : presence => true 

Note ": sự hiện diện", nó phải là ": sự hiện diện ". Bây giờ Rail ném một lỗi cú pháp

C:/blog/app/models/post.rb:4: syntax error, unexpected ':', expecting keyword_end 
validates :name, : presence => true 

Nhưng nếu bạn "Refresh" Trình duyệt của bạn, nó che giấu lỗi cú pháp, thay vì cung cấp cho

undefined method `key?' for nil:NilClass 

Dường như Rails bộ nhớ đệm là thủ phạm. :)

+0

vâng đó thực sự thường là trường hợp .. đó là cách tôi gặp phải vấn đề này ít nhất. Tôi sẽ chấp nhận câu trả lời cho đến khi ai đó có thể cung cấp một cái nhìn sâu sắc hơn .. – Stpn

+0

Tôi làm Rails chuyên nghiệp, và valdiates vẫn không phải là điều tương tự như xác nhận. – Chris

+0

để tham khảo trong tương lai - có cùng một vấn đề vì lỗi đánh máy: tôi đã viết xác thực thay vì xác thực – nurinur

9

Đây có thể không phải là vấn đề của bạn vì có vẻ như bạn đã có mã làm việc để bắt đầu, nhưng để tham khảo cho người khác trong tương lai, tôi gặp lỗi tương tự do lỗi đánh máy đơn giản bên trong mã mô hình của tôi, như vậy:

class Foo < ActiveRecord::Base 
    validates :content, :length => { maximum => 10 } 
end 

mà cần phải có được:

class Foo < ActiveRecord::Base 
    validates :content, :length => { :maximum => 10 } 
end 

Lưu ý là "tối đa" và ": tối đa" - điều này dẫn đến các lỗi bằng không chính xác ở trên, và ra đi khi tôi cố định typo đó.

6

Tôi đồng ý với bmoeskau rằng bạn nên kiểm tra mã mẫu của mình để tìm lỗi. Trước sự ngạc nhiên của tôi, các mô hình dường như đôi khi được tải trong giai đoạn định tuyến. Tôi đã phát hiện:

  1. Mã gây ra sự cố, trong trường hợp của tôi, không có trong bộ điều khiển mà tôi mong đợi.
  2. Lỗi undefined method `key?' for nil:NilClass thường chỉ xảy ra sau lần đầu tiên tôi truy cập trang.

Theo như tôi có thể nói, những gì xảy ra là

  1. Giả sử chúng ta có một giàn giáo cho Ví dụ, với một số mã xấu trong app/models/example.rb
  2. Một yêu cầu được thực hiện cho /examples
  3. Các tuyến một phần của Rails đối sánh với số app/controllers/examples_controller.rb nhưng nó trước tiên tải app/models/example.rb. Tôi không biết tại sao nó tải mô hình, nhưng hiệu quả là, tôi phỏng đoán: Lỗi trong mô hình dừng ngắn một phần của mã định tuyến, hỏng xây dựng bộ nhớ cache của các tuyến đường.
  4. Tại thời điểm này, nếu tôi may mắn lỗi sẽ được báo cáo lại cho tôi trong trình duyệt. Đôi khi, tuy nhiên, tôi chỉ đơn giản nhận được một thông báo nói rằng No route matches [GET] "/examples" (Để công bằng với Rails, biến chứng thêm này có vẻ là lỗi của việc không sử dụng resources :examples để thực hiện lộ trình. Điều sau xảy ra bất kể).
  5. Yêu cầu thứ hai được thực hiện cho /examples
  6. Conjecture: Lần này Rails định tuyến đang cố gắng sử dụng tài liệu tham khảo cache của nó để app/controllers/examples_controller.rb nhưng bộ nhớ cache tuyến đường bị hỏng (một biến là nil) vì mã mà bộ không bao giờ kết thúc.

Mục cuối cùng này gây khó chịu nhất vì sự cố gây ra lỗi (mã xấu trong mô hình) thậm chí không được chạy.

7

Không chắc chắn nếu đây là lỗi tương tự, nhưng tôi đã có một vấn đề tương tự. Trong lần tải đầu tiên của mô hình lỗi, Đường ray phản hồi với Lỗi định tuyến và sau đó cho các yêu cầu đến sau nó phản hồi với undefined method 'key?' for nil:NilClass và theo dõi ngăn xếp giống nhau.

Dường như đây là lỗi với Bộ đệm ẩn của lớp Rails, nhưng có thể xoay quanh bằng cách bật bộ nhớ đệm của lớp hoặc vô hiệu hóa khi tải lại lớp thay đổi.

config.cache_classes = true 

hoặc

config.cache_classes = false 
config.reload_classes_only_on_change = false 
Các vấn đề liên quan