Ai đó hiểu cách hoạt động của bộ nhớ đệm đường ray có thể thực sự giúp tôi ở đây. Dưới đây là đoạn code, lồng vào bên trong của khối Rails :: Initializer.run:Hằng số được đặt trong môi trường.rb biến mất trong chế độ phát triển
config.after_initialize do
SomeClass.const_set 'SOME_CONST', 'SOME_VAL'
end
Bây giờ nếu tôi chạy script/server
và thực hiện một yêu cầu, tất cả mọi thứ là dandy. Tuy nhiên, trên yêu cầu thứ hai cho ứng dụng Rails của tôi, tất cả đi vào địa ngục với một lỗi liên tục đơn vị. Trong chế độ sản xuất, tôi có thể thực hiện yêu cầu thứ hai thành công, có nghĩa là hằng số vẫn còn đó.
Tôi đã khắc phục vấn đề bằng cách thay đổi trên để:
config.after_initialize do
require 'some_class' # in RAILS_ROOT/lib/some_class.rb
SomeClass.const_set 'SOME_CONST', 'SOME_VAL'
end
Nhưng bây giờ có nghĩa là bất cứ khi nào tôi thực hiện một sự thay đổi để some_class.rb, tôi phải khởi động lại máy chủ. Có cách nào để thiết lập hằng số trong một tập tin môi trường và có họ làm việc một cách chính xác trong chế độ phát triển? Tại sao hằng số tồn tại trên yêu cầu đầu tiên, nhưng không tồn tại yêu cầu sau?
UPDATE: Kể từ environment.rb chỉ đọc khi ứng dụng Rails được khởi động và tôi muốn cả hai tập tin và các mô hình lib của tôi để được nạp lại vào từng yêu cầu, tôi đã buộc phải di chuyển hằng vào file some_class.rb như sau:
if Rails.env.development?
const_set 'SOME_CONST', 'SOME_DEVELOPMENT_VAL'
end
Và trong môi trường/production.rb, tôi có mã const_set cũ.
CẬP NHẬT: Phương pháp tốt hơn bằng cách sử dụng config.to_prepare được nêu chi tiết bên dưới.
Cảm ơn bạn, đó chính là câu trả lời tôi đang tìm kiếm. – joshuaxls
Những cái ôm và những nụ hôn với @joshuaxls và @Sarah Mei, trời ơi, điều này thực sự đã giúp tôi rất nhiều! – clacke
Tải lại các lớp học mà không cần chạy bộ khởi tạo là một điều thực sự ... có thể thông minh, nhưng rất khó hiểu. – clacke