2011-01-24 32 views
57

Tôi có bộ khởi tạo tải cài đặt cấu hình từ tệp yaml. Tôi cần phải sử dụng các cài đặt này trong các trình khởi tạo khác. Các thiết lập không được nhìn thấy bởi các initializers cần chúng. Những gì tôi nghĩ đang xảy ra là các cài đặt đang được tải quá muộn. Làm cách nào để đảm bảo rằng trình khởi tạo cấu hình của tôi được tải trước? Có phải các đường tắt không muốn khởi tạo phụ thuộc vào cái khác?Làm cách nào để thay đổi thứ tự tải của bộ khởi tạo trong Rails 3?

Cảm ơn!

Trả lời

75

Đổi tên bộ khởi tạo thành 01_name.rb, điều này sẽ buộc nó tải bảng chữ cái trước đây.

Sửa

Để trích dẫn chính thức Rails Guide for configuration (nhờ zetetic for the tip):

Nếu bạn có bất kỳ phụ thuộc trật tự trong initializers của bạn, bạn có thể kiểm soát trật tự tải bằng cách đặt tên . Ví dụ: 01_critical.rb sẽ được tải trước 02_normal.rb.

+47

Trong khi điều này có hiệu quả, có vẻ như cách giải quyết xấu. –

+1

Vâng, tôi đang đối mặt với chính xác những điều tương tự bản thân mình, và đây là những gì tôi đang sử dụng. Vì vậy, tôi sẽ chờ đợi với bạn :) –

+1

Tôi làm như vậy, và nó cũng áp dụng cho các tập tin hạt giống: chúng cũng được sắp xếp theo thứ tự bảng chữ cái. Tôi không biết một phương pháp rõ ràng khác để thay đổi thứ tự. – nathanvda

24

Đặt mã cấu hình trong tập tin cấu hình/environment.rb, ngay sau khi người đầu tiên yêu cầu tuyên bố, chẳng hạn như:

# Load the rails application 
require File.expand_path('../application', __FILE__) 

# Load global configurations 
CONFIG = Hashie::Mash.new YAML.load_file(Rails.root.join("config", "application.yml"))[Rails.env] 

# Initialize the rails application 
RailsSetup::Application.initialize! 
+0

Cảm ơn. Điều đó làm việc cho tôi. –

19

Mặc dù hướng dẫn khuyến cáo thêm vào trước tên file khởi tạo với những con số, mà dường như xấu xí. Một cách khác là sử dụng các móc khởi tạo được cung cấp. Xem http://guides.rubyonrails.org/configuring.html#initialization-events

Ví dụ:

# application.rb 

module YourApp 
    class Application < Rails::Application 
    config.before_initialize do 
    # initialization code goes here 
    end 
    end 
end 
+0

Splendiferous! NẾU bạn đang làm việc với Rails 5. – Midwire

+0

@Midwire Dường như được hỗ trợ trong Rails 4.2 theo như tôi có thể nói rõ: http://guides.rubyonrails.org/v4.2/configuring.html#initialization-events – samjewell

+0

@samjewell Yep, dường như là trường hợp mặc dù tôi đã không thử nghiệm nó. – Midwire

6

Sử dụng require_relative để đảm bảo một tệp được tải trước.

# aaa.rb 
require_relative 'bbb' 
# ... code using values from bbb.rb ... 
+2

Điều đó hoạt động, nhưng ngoài việc chạy tệp được yêu cầu tại thời điểm được yêu cầu, Rails sẽ * một lần nữa * chạy tệp khi thông thường trong quá trình khởi chạy bình thường (hiệu quả, theo thứ tự chúng xuất hiện trong một danh sách thư mục). Vì vậy, bạn sẽ muốn đảm bảo rằng các tập tin bạn đang yêu cầu không làm bất cứ điều gì bạn sẽ không muốn được chạy nhiều hơn một lần. Ví dụ, nếu tập tin yêu cầu khởi tạo một hằng số, Rails sẽ cảnh báo bạn rằng bạn đang khởi tạo lại hằng số. –

+0

@MarkSchneider Ví dụ khác: nếu tệp chèn phần mềm trung gian có '# use', phần mềm trung gian sẽ được chèn lại. Điều này thậm chí có thể phá vỡ ứng dụng. –

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