2009-08-03 53 views
58

Kể từ Rails 2.3, cách nào đúng để thêm thư mục vào đường dẫn tải để nó móc vào cơ chế tự động tải lại của Rails?Thêm thư mục vào đường dẫn tải trong Rails?

Ví dụ cụ thể mà tôi đang nghĩ là tôi có một lớp có nhiều lớp con sử dụng STI và tôi nghĩ rằng nên đặt chúng vào thư mục con thay vì lộn xộn cấp cao nhất. Vì vậy, tôi sẽ có một cái gì đó như:

#app/models/widget.rb 
class Widget < ActiveRecord::Base 
    add_to_load_path File.join(File.dirname(__FILE__), "widgets") 
end 

#app/models/widgets/bar_widget.rb 
class BarWidget < Widget 
end 

#app/models/widgets/foo_widget.rb 
class FooWidget < Widget 
end 

Đó là phương pháp add_to_load_path mà tôi đang tìm kiếm.

Trả lời

60

Đối phiên bản cũ của Rails:

Bạn có thể làm điều này trong tập tin cấu hình environment.rb của bạn.

config.load_paths << "#{RAILS_ROOT}/app/widgets" 

-

Đối Rails 3, xem câu trả lời rống lên

+8

ActiveSupport :: Dependencies.autoload_paths << "# {RAILS_ROOT}/ứng dụng/tiện ích con" –

+1

Xem câu trả lời bằng cách bỏ túi đầy đủ tư cách thực sự chính xác. Điều này hiện đã lỗi thời. – micapam

1

tôi thấy mình cần phải làm điều này sau khi cấu hình block-- không tiếp cận với đối tượng cấu hình nữa.

này đã làm các trick

ActiveSupport::Dependencies.load_paths << "#{RAILS_ROOT}/app/widgets" 
27

Trong Rails 3, bạn có thể thiết lập này trong config/application.rb, nơi mẫu này được cung cấp theo mặc định:

# Add additional load paths for your own custom dirs 
# config.load_paths += %W(#{config.root}/extras) 
+13

# config.autoload_paths + =% W (# {config.root}/extras) – tamersalama

8

Một bản cập nhật cho đường ray 3 - activesupport 3.0.0:

Thay vì:

ActiveSupport::Dependencies.load_paths << "#{RAILS_ROOT}/app/widgets" 

Bạn có thể cần phải làm điều này:

ActiveSupport::Dependencies.autoload_paths << "#{RAILS_ROOT}/app/widgets" 
+2

Rails.root là cần thiết trong Rails 3 thay vì RAILS_ROOT –

+0

Theo Rails 3.0.3, tôi phải sử dụng ActiveSupport :: Dependencies.autoload_paths + =% W (# {Rails.root.to_s}/app/libs) –

101

Trong phiên bản hiện tại của Rails (3.2.8), điều này đã được thay đổi trong file application.rb.

Mã này hiện đang nhận xét ra như:

# Custom directories with classes and modules you want to be autoloadable. 
    # config.autoload_paths += %W(#{config.root}/extras) 

sẽ cần phải cập nhật autoload_paths giá trị. Cố gắng sửa đổi biến số load_paths trước đây gây ra lỗi này.

/configuration.rb:85:in `method_missing': undefined method `load_paths' for #<Rails::Application::Configuration:0xac670b4> (NoMethodError) 

cho một ví dụ, đối với mỗi con đường để thêm vào autoload_paths config, thêm một dòng tương tự như sau:

config.autoload_paths += %W(#{config.root}/app/validators) 

config.autoload_paths chấp nhận một loạt các con đường mà từ đó Rails hằng chí autoload . Mặc định là tất cả các thư mục theo số app.

http://guides.rubyonrails.org/configuring.html


Từ commentor (hakunin) dưới đây:

Nếu thư mục đang được app/, bạn không cần phải thêm nó ở bất cứ đâu, nó chỉ nên làm việc theo mặc định (chắc chắn trong 3.2.12). Đường ray có eager_load_paths hoạt động như autoload_paths trong quá trình phát triển và tải trọng mong muốn trong sản xuất. Tất cả các thư mục app/* được tự động thêm vào đó.

+1

Bạn đang trả lời câu hỏi 3 năm cũ, và đường ray 3 không tồn tại khi câu hỏi này được hỏi – Bassetassen

+78

Bro, bạn biết công cụ tìm kiếm Google, nó liệt kê kết quả tìm kiếm cũ 3 năm - tất cả thời gian. Nó sẽ không được tốt đẹp nếu kết quả 3 tuổi có thể trả lời câu hỏi của bạn và kết thúc nhiệm vụ của bạn sớm hơn? –

+0

Tất nhiên, nhưng câu hỏi này đã có một câu trả lời được chấp nhận, vì vậy người hỏi đã có câu trả lời cho câu hỏi của mình. – Bassetassen

8

On Rails 5 bạn cần phải thêm đoạn mã sau vào environment.rb:

# Add the widgets folder to the autoload path 
Rails.application.configure do 
    config.autoload_paths << "#{Rails.root}/app/widgets" 
end 
+1

Rails 5 thực sự tự động tải tất cả các thư mục trong thư mục ứng dụng. –

+0

Cảm ơn. Đây là hành vi mặc định thời gian qua tôi đã kiểm tra, nhưng thành thật mà nói tôi không thể nhớ nếu nó là một vấn đề sản xuất duy nhất như đã nêu ở đây: http://blog.bigbinary.com/2016/08/29/rails-5-disables -autoloading-after-booting-the-app-in-production.html –

7

Trong Rails 5 bạn không cần phải tải một cách rõ ràng các thư mục từ bên trong thư mục ứng dụng nữa. Tất cả các thư mục được đặt bên trong đều có sẵn trực tiếp. Bạn không cần phải chạm vào bất kỳ tệp cấu hình nào. Nhưng có vẻ như có một số vấn đề với Spring. do đó

Các công việc mới là:

  1. tạo một thư mục mới và lớp bên trong thư mục/app
  2. chạy spring stop trên dòng lệnh
  3. kiểm tra các autoload-đường với bin/rails r 'puts ActiveSupport::Dependencies.autoload_paths' trên dòng lệnh . Thư mục mới bây giờ sẽ được liệt kê.
  4. chạy spring start trên dòng lệnh
+0

Tôi đang tìm cái này không đáng tin cậy và tôi chưa bao giờ cài đặt lò xo hay trong gemfile (khi được thực hiện). Bởi không đáng tin cậy tôi có nghĩa là mã đặt tìm thấy các thư mục nhưng không ai trong số các tập tin trong nó được nạp để bao gồm ở nơi khác. Bao gồm cả các lớp làm việc cho tôi khi tôi đặt autoload_path trong config/application.rb thay vào đó. – Mirv

+0

@Mirv - bạn đang sử dụng phiên bản đường ray nào? và xem: http://guides.rubyonrails.org/autoloading_and_reloading_constants.html#autoload-paths –

+0

Yea, tôi đọc những điều đó và sau đó được thử nghiệm trên đường ray 5.0.0 & 5.1.0 trong IDE của cloud9. Nó dường như không xử lý như thay đổi bình thường cho các tập tin khi chạy 'rails s', nhưng thay vào đó tôi phải' tải lại! 'Trong khi trong' rails c', không được đề cập cho 3 phần khác của tài liệu! Tôi đã trở lại và kiểm tra, ngay bây giờ vì nó là viết tắt của dự án của tôi - Tôi phải tự thêm tập tin mặc dù nó nằm trong app/classes/filler.rb trong khi sử dụng 'rails c' ... Tôi thậm chí khởi động lại không gian làm việc, mặc dù Tôi chưa bắt đầu một dự án hoàn toàn mới. – Mirv

2

Trong config/application.rb thêm config.autoload_path << "#{config.root}/dir/widgets"

file sẽ trông như thế này:

module MyApp 
    class Application < Rails::Application 
    config.autoload_paths << "config.root}/widgets" 
    end 
end 

Tôi biết điều này làm cho Rails 4 và 5. Có lẽ những người khác cũng .

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