2017-10-18 21 views
6

Đây là a brand new Rails 5.1.4 app, với mô hình và một vài tuyến đường và bộ điều khiển.Tự động tải/độ phân giải liên tục của Rails đang tạo mô-đun ma

Một bộ điều khiển namespaced là tham khảo một mô hình cấp cao nhất:

class AdminArea::WelcomeController < ApplicationController 
    def index 
    @user = User.new(name: 'Sergio') 
    end 
end 

Cho đến nay rất tốt. Bạn có thể kiểm tra tổng thể, điều hướng đến http://localhost:3000/admin_area/welcome và xem nó hoạt động.

NHƯNG nếu chúng tôi were to add an empty directory app/presenters/admin_area/user/ *, thì mọi thứ trở nên lạ. Đột nhiên, User trong bộ điều khiển đó không phải là mô hình của tôi, mà là một mô-đun không tồn tại!

NoMethodError (undefined method `new' for AdminArea::User:Module): 

app/controllers/admin_area/welcome_controller.rb:3:in `index' 

Tự nhiên, mô-đun này không có bất kỳ phương pháp nào [không được tích hợp] và không thể được ghim vào tệp nguồn trên đĩa.

Câu hỏi: tại sao thêm một thư mục trống làm cho đường ray bí ẩn gợi ra mô-đun ra khỏi không khí mỏng thay vì tên giải quyết chính xác User cho mô hình của tôi?


* thực sự, nếu bạn kiểm tra nhánh đó, bạn sẽ gặp lỗi khác.

NameError (chưa được khởi tạo liên tục AdminArea :: WelcomeController :: tài khoản)

vì git sẽ không cho phép tôi thực hiện một thư mục rỗng, vì vậy tôi đã thêm một tập tin .keep trong đó. Nhưng ngay sau khi bạn xóa tệp đó, bạn sẽ nhận được hành vi được mô tả ở trên.

+0

có thể trùng lặp của [Rails 4: tổ chức mô hình đường ray trong đường tiểu mà không namespacing mô hình] (https://stackoverflow.com/questions/18934115/rails-4-organize-rails-models-in-sub mô hình -path-without-namespacing) – jon1467

+0

@ jon1467: không, không trùng lặp. Trừ khi tôi đang thiếu một cái gì đó. –

+0

Xin lỗi, tôi nghĩ rằng tôi đã hiểu sai câu hỏi của bạn khi hỏi cách đặt mô hình người dùng của bạn trong thư mục 'người trình bày'. Lỗi của tôi. – jon1467

Trả lời

5

Đây là hệ quả của tra cứu hằng số ruby ​​và cách Rails giải quyết tự động tải.

Hằng số User trong bộ điều khiển được gọi là "relative reference", có nghĩa là nó phải được giải quyết liên quan đến không gian tên trong đó nó xảy ra. Đối với hằng số này, có ba biến thể nơi hằng số có thể được định nghĩa:

AdminArea::WelcomeController::User 
AdminArea::User 
User 

Rails tự động load bản đồ những hằng số vào tên file và lặp trên các autoload_path s để tìm các tập tin mà hằng số được định nghĩa. Ví dụ:

app/assets/admin_area/welcome_controller/user.rb 
app/assets/admin_area/welcome_controller/user 
app/channels/admin_area/welcome_controller/user.rb 
... 
app/assets/admin_area/user.rb 
app/assets/admin_area/user 
... 
app/assets/user.rb 
... 
app/models/user.rb #=> here it is! 

Khi bạn thêm thư mục admin_area/user vào thư mục trình bày, bạn xác định có hiệu quả một hằng số như vậy. Modules in Rails are automagically created, do đó bạn không thực sự cần phải tạo tệp nơi bạn xác định các mô-đun này chỉ hoạt động như không gian tên.

Khi bạn thêm các thư mục, thư mục xuất hiện trong tra cứu Rails:

... 
app/assets/admin_area/user.rb 
app/assets/admin_area/user 
... 
app/presenters/admin_area/user #=> Here Rails finds the folder 

và Rails giải quyết các User để tham khảo để mô-đun đó.

Tuy nhiên đây là khá dễ dàng để sửa chữa, Nếu bạn muốn User liên tục được sử dụng trong vòng AdminArea namespace để tham khảo một hằng số cấp cao nhất (và không phải là AdminArea::User mô-đun), bạn nên thay đổi "tài liệu tham khảo tương đối" thành một tham chiếu tuyệt đối bởi trước hằng số với ::.

@user = ::User.new(name: 'Sergio') 
+0

Phần duy nhất còn thiếu, tôi nghĩ, là liên kết đến mã tự động tạo mô-đun. –

+1

Ở đó bạn truy cập http://guides.rubyonrails.org/autoloading_and_reloading_constants.html#automatic-modules :) "Nếu autoload_path có một tệp có tên admin.rb Rails sẽ tải tệp đó, nhưng nếu không có tệp như vậy và thư mục được gọi là admin được tìm thấy, Rails tạo ra một mô-đun trống và gán nó vào hằng số quản trị khi đang chạy. " –

+0

Vậy đó, cảm ơn! Tôi sẽ trao tiền thưởng ngay sau khi nó cho phép tôi :) –

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