2010-07-04 20 views
9

Mỗi lần tôi nhận được một cảnh báo:Rails3: cảnh báo: mục cấp đầu ApplicationController liên tục được tham chiếu bởi

app/controllers/agency/agencies_controller.rb:1: warning: toplevel constant ApplicationController referenced by Agency::ApplicationController 

agencies_controller.rb của tôi:

class Agency::AgenciesController < Agency::ApplicationController 

    def index 
    ... 
    end 

    ... 
end 

Và Cơ quan :: ApplicationController:

class Agency::ApplicationController < ApplicationController 
    layout 'agency' 

    helper_method :current_agency 
    private 

    def current_agency 
    @current_agency ||= current_user.agency 
    end 

end 

Những gì các đường ray muốn từ tôi? Rắc rối là gì?

Cùng hoàn cảnh với một bộ điều khiển

class Agency::ClientsController < Agency::ApplicationController 
    ... 
end 

Và không có cảnh báo, không có lỗi ...

Trả lời

5

ApplicationController là tên của bộ điều khiển lớp cha mà Rails tạo cho bạn khi bạn tạo một dự án mới mà tất cả các lớp điều khiển khác của bạn kế thừa từ. Có thể có một xung đột ở đâu đó bởi vì bạn đã sử dụng cùng một tên, ngay cả khi bạn đặt nó trong một không gian tên.

Hãy thử đặt tên Agency::ApplicationController khác của bạn.

+0

Nhưng tại sao không có rắc rối với Cơ quan :: ClientsController ?? – petRUShka

+1

Vì 'ClientsController' không có ý nghĩa đặc biệt đối với Rails. –

+0

Tôi có một chức năng Admin :: ApplicationController mà không cung cấp cho các vấn đề. Vì vậy, không nên yêu cầu đổi tên. Có thể có sự mơ hồ ở nơi khác trong ngăn xếp cuộc gọi, mà Ruby đang phàn nàn. –

2

Tôi gặp sự cố tương tự, sau khi thiết lập SporkWatchr. Trong quá trình này, tôi đã tắt tính năng lưu trữ lớp học (config_cache_classes => false trong config/environments/test.rb) để thay đổi sẽ được tải lại khi cần thiết trong môi trường spork. Đang chuyển bộ nhớ cache lớp học back on khiến các cảnh báo biến mất.

7

Tôi gặp sự cố tương tự khi chạy SporkWatchr trong các bộ điều khiển không gian tên Admin của mình. Vì vậy, tôi đã cố định này bằng cách thêm đoạn mã sau vào each_run khối trong spec_helper.rb:

Dir[File.expand_path("app/controllers/admin/*.rb")].each do |file| 
    require file 
end 

Tất cả các khoản tín dụng đi đến guy from this thread

+1

Cảm ơn, điều này đã giải quyết được vấn đề. –

+1

Cảm ơn điều này làm việc tuyệt vời, tôi sửa đổi nó một chút mặc dù ngắn gọn: Dir [Rails.root.join ("ứng dụng/bộ điều khiển/admin/*. Rb")]. Mỗi {| f | yêu cầu f} –

+0

sau nhiều giờ đập đầu của tôi .. điều này giải quyết vấn đề của tôi .. tốt mà tôi nhận thấy rằng cảnh báo và tốt mà tôi tìm thấy câu trả lời này .. cảm ơn rất nhiều. – whizcreed

12

Tôi nhận ra câu hỏi này là gần hai tuổi nhưng gần đây tôi stumbled khi này qua another stackoverflow đăng bài và muốn chia sẻ một số thông tin chi tiết.

Về cơ bản, nếu không gian tên của bạn Agency xảy ra là class thay vì module, bạn sẽ nhận được cảnh báo đó. Trong bài đăng stackoverflow tôi dán ở trên, họ đã có một mô hình (class) của Admin và không gian tên của chúng cũng là Admin.

This cung cấp giải thích tốt hơn về những gì đang xảy ra.

Vì vậy, hãy kiểm tra xem mã của bạn có đang xác định một lớp học Agency ở đâu đó không. Chúc may mắn.

2

Trong trường hợp của tôi, đó là vấn đề với Devise. Tôi đã có một mô hình quản trị phát triển và một tuyến đường quản trị không gian tên. Thay đổi tuyến đường không gian tên thành Quản trị viên đã giải quyết được sự cố.

0

Giải pháp đối với tôi là thêm dòng này:

# spec/rails_helper.rb 
Dir[File.expand_path("app/controllers/admin/*.rb")].each { |file| require file } 
Các vấn đề liên quan