2010-10-23 15 views
12

Tôi đang nâng cấp ứng dụng Rails của tôi để làm việc với Ruby 1,9 và tôi tiếp tục lỗi gặp phải như thế này:"Mô-đun ẩn danh không có tên được tham chiếu bởi" thực sự có nghĩa là gì?

Anonymous modules have no name to be referenced by 
/home/foo/.gem/ruby/1.9.1/gems/activesupport-2.3.8/lib/active_support/dependencies.rb:585:in `to_constant_name' 
/home/foo/.gem/ruby/1.9.1/gems/activesupport-2.3.8/lib/active_support/dependencies.rb:391:in `qualified_name_for' 
/home/foo/.gem/ruby/1.9.1/gems/activesupport-2.3.8/lib/active_support/dependencies.rb:104:in `rescue in const_missing' 
/home/foo/.gem/ruby/1.9.1/gems/activesupport-2.3.8/lib/active_support/dependencies.rb:94:in `const_missing' 
/home/foo/app/config/environment.rb:66:in `block in <top (required)>' 
etc. 

Google tìm thấy tất cả các loại hits cho điều này, nhưng mỗi người trong số họ gắn liền với một sửa chữa cụ thể cho một cụ thể đá quý hoặc ứng dụng. Không ai trong số họ giải thích những gì thông điệp thực sự có nghĩa là.

  • "Mô-đun ẩn danh" là gì?
  • Thông báo lỗi này đến từ đâu? (Bản dịch của Ruby?)
  • Điều gì khác biệt về Ruby 1.9 gây ra điều này? (Đường ray 2.3.8 với Ruby 1.8.7 không gặp phải điều này.)
  • Cách chung/thích hợp để sửa lỗi này là gì?

Dòng 66 của environment.rb là cấu hình cho super_exception_notifier (phiên bản cũ, 2.0.8):

ExceptionNotifier.configure_exception_notifier do |config| 
    config[:sender_address] = %("Foo" <[email protected]>) 
    config[:exception_recipients] = %w([email protected]) 
    config[:skip_local_notification] = false 
end 

Từ những gì tôi có thể nói, ExceptionNotifier là undefined, và ActiveSupport đang cố gắng một cách kỳ diệu tải nó, nhưng thất bại và sau đó thất bại một lần nữa cố gắng để in một thông báo lỗi tốt đẹp.

+0

kiểm tra các xung đột tên trong tên phương thức/mô-đun trong ứng dụng của bạn bằng đường ray. lỗi tối nghĩa thường xảy ra khi nội dung mã của bạn va chạm với AR. – glebm

Trả lời

6

Một module nặc danh là một mô-đun được khai báo như sau:

Fred = Module.new do 
    def meth1 
    "hello" 
    end 
    def meth2 
    "bye" 
    end 
end 

thay vì bằng Module mod_name <block> cú pháp thông thường. Vì họ không có tên mô-đun, bạn không thể truy xuất tên mô-đun. to_constant_name đang cố gắng gọi desc.name.blank? trong đó desc là một mô-đun ẩn danh (không có name).

Lỗi này đến từ mô-đun ActiveSupport, có thể cho biết lỗi trong gem active_support hoặc có thể chỉ ra rằng một số đoạn mã khác đang sử dụng ActiveSupport không chính xác. Các thông báo lỗi một mình không cung cấp đủ thông tin để xác định thủ phạm (với tôi ít nhất, một người có nhiều kinh nghiệm đường ray có thể cung cấp cái nhìn sâu sắc hơn).

Nếu không biết mã vi phạm, cũng khó nói chính xác lý do lỗi này xuất hiện với 1,9 hoặc cần phải làm gì để khắc phục. Xem xét rằng có rất nhiều đá quý chưa được bảo trì và chưa được bảo trì ở đó chưa được cập nhật cho 1.9, tôi nghi ngờ rằng ActiveSupport không phải là nguồn gốc của vấn đề. Nâng cấp tất cả các đá quý của bạn có phiên bản tương thích 1,9, và sau đó thử vô hiệu hóa đá quý khác của bạn tại một thời điểm (nếu bạn có thể) và xem nếu bạn vẫn nhận được lỗi.

Nếu bạn cung cấp danh sách các loại đá quý khác mà bạn đang sử dụng, ai đó có thể đã gặp lỗi trước đây có thể cung cấp một số chi tiết.

3

Điều này có thể xảy ra nếu bạn cố gắng khai thác lớp nội bộ và ngữ cảnh mô đun của ActiveRecord theo cách không đúng. Tôi đã có lỗi này ngày hôm qua trong khi làm việc trên một viên ngọc mà mở rộng hoạt động sâu bên trong của ActiveRecord. Cuối cùng tôi đã xoay xở để giải quyết vấn đề này bằng cách thiết kế lại mã của tôi, khai thác các ngữ cảnh bên trong. Nó sẽ là thú vị để xem các đường xung quanh của environment.rb:66 để phân tích thêm.

+0

Câu hỏi đã chỉnh sửa để bao gồm mã không thành công. – ScottJ

0

Khi tôi gặp lỗi này, đó là do lỗi chính tả trong khi xác định lớp học. Nếu bạn nhận được lỗi này, có thể đáng xem xét các định nghĩa mô-đun và lớp học của bạn cho lỗi chính tả.

+0

Kinda muộn cho bữa tiệc, tôi biết, nhưng các câu trả lời khác (trong khi thông tin) không thực sự cung cấp lời khuyên liên quan đến các mặt hàng cụ thể để bắt đầu kiểm tra. –

1

Điều này có thể xảy ra khi tên lớp không khớp với tên tệp, trong trường hợp của tôi đó là tệp có tên application.rb tiếp tục lớp ApplicationController . Đổi tên tệp thành application_controller.rb đã giải quyết được sự cố.

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