2011-02-07 32 views
6

Tôi đang tạo ứng dụng Rails 3 nơi người dùng có thể chọn một trong số một số mẫu và xây dựng một trang web nhỏ. Tôi đang cố gắng khởi tạo tất cả các mẫu có sẵn khi ứng dụng bắt đầu. Về cơ bản đó là một tệp để tôi xác định tất cả, sau đó gọi Template.add(template) cho mỗi một trong số chúng, do đó lưu trữ chúng trong @@templates và tôi có thể truy cập chúng qua Template.find(name).Tải lại Rails 3 initializer trong chế độ phát triển

Vấn đề ở chế độ phát triển, trình khởi tạo tôi đã thực hiện cuộc gọi đến Template.add đang được tải theo yêu cầu đầu tiên, sau đó bị xóa trên reload!. Tôi đã đọc về config.to_prepare, nhưng nó không phải đang làm việc cho tôi, rất có thể vì tôi yêu cầu các mẫu như thế này:

# template config at app/templates/template_name/template_name.rb 
path = File.expand_path(Rails.root + 'app/templates') 
Dir[File.join(path, '/*')].each do |template| 
    name = File.basename(template) 
    require File.join(path, name, "#{name}.rb") 
end 

tôi có thể làm gì để một trong hai lại những tập tin sau khi reload! hoặc giữ chúng khỏi bị thùng rác ở tất cả? Ngoài ra, nếu bạn có một đề nghị cho một cách tốt hơn để xử lý này, tôi là tất cả các tai. Tôi vẫn nhận được chân của tôi với Rails, đặc biệt là liên quan đến công cụ cấu hình.

Tôi tạm thời tránh sự cố này bằng cách tải dữ liệu trong lớp. Cứu tôi khỏi tình trạng xấu xí, phi mô-đun này.

+0

Tôi không chắc mình có câu hỏi của bạn. Vì vậy, chỉ là một gợi ý: tại sao bạn không tự động tải các tập tin của bạn? http: // hemju.com/2010/09/22/rails-3-quicktip-autoload-lib-directory-bao gồm-tất cả-thư mục con/ – apneadiving

+0

Thiếu sự quen thuộc với quy trình, thực sự, nhưng nó không giải quyết được vấn đề của tôi. Mô hình Mẫu được tải lại trên mọi yêu cầu (cache_classes = false trong phát triển) và tệp mẫu của tôi sẽ không được tải lại, do đó, yêu cầu thứ hai không có bất kỳ mẫu nào được "đăng ký" với mẫu Mẫu. – coreyward

+0

Bạn có thể giải thích thêm một chút về lý do bạn cho rằng điều này không hiệu quả với to_prepare không? – johnmcaliley

Trả lời

1

Tôi nghĩ rằng bạn nên để có thể làm điều này với config.to_prepare nếu bạn di chuyển các cuộc gọi của bạn để Template.add ra khỏi template_name.rb file (Tôi giả định đó là nơi mà bây giờ họ đang có), và vào mã tải của bạn, ngay sau require . Ví dụ, hãy xem xét thêm phương pháp lớp này đến lớp Mẫu, và sau đó thậm chí có thể gọi đó là từ lớp chính nó khi nó lần đầu tiên được nạp:

class Template 
    def self.load_all 
    # template config at app/templates/template_name/template_name.rb 
    path = File.expand_path(Rails.root + 'app/templates') 
    Dir[File.join(path, '/*')].each do |template| 
     name = File.basename(template) 
     require File.join(path, name, "#{name}.rb") 

     # Register the template even if the class itself is already loaded. 
     Template.add(name) 
    end 
    end 

    # Initially load all templates. 
    Template.load_all 
end 

Sau đó loại bỏ mã Template.add(name) từ template_name.rb file nơi họ đang đăng ký tự . (Một lần nữa, tôi giả định đây là nơi mà hiện tại xảy ra - Tôi không hoàn toàn rõ ràng về điều này từ bài viết gốc của bạn.) Hoặc có lẽ bạn chỉ muốn chắc chắn Template.add là idempotent và âm thầm loại bỏ trùng lặp.

Cuối cùng, thêm dòng sau vào config/environments/development.rb:

config.to_prepare do 
    Template.load_all 
end 

Đó sẽ tải lại tất cả các mẫu của bạn sau khi tải lại lớp Template.

Tôi chưa thử điều này, nhưng với cuộc gọi đến Template.load_all Tôi đề xuất ở cuối lớp Template, bạn thậm chí có thể không cần phần config.to_prepare.

+0

Tôi không biết về 'config.to_prepare' khi tôi gặp vấn đề này và chưa nghĩ nhiều về nó kể từ khi tôi đăng bài này, nhưng tôi nghĩ * điều này sẽ hoạt động khá tốt đối với tôi. Tôi sẽ cung cấp cho nó một đi khi tôi có thời gian và chấp nhận nếu có. – coreyward

1

Cách lưu trữ tra cứu tên mẫu vào tệp của chúng trong bộ nhớ lưu trữ như memcached hoặc Redis hoặc thậm chí trong cơ sở dữ liệu. Trình khởi tạo có thể tải lên kho lưu trữ bộ nhớ hoặc đảm bảo rằng cơ sở dữ liệu được cập nhật với tất cả các giá trị, và sau đó Template.find chỉ có thể xem cửa hàng để xem vị trí của tệp hoặc thậm chí chỉ lấy tên lớp nếu chúng đã Được nạp. Chỉ cần nhìn thấy nếu tên lớp được định nghĩa có thể cho bạn biết nếu bạn cần yêu cầu tệp mẫu hoặc chỉ cần tiếp tục và tạo cá thể mới của bạn.

Về cơ bản lưu trữ @@templates ngoài bộ nhớ xử lý đường ray hoặc ít nhất đủ thông tin mà bạn có thể tạo các bộ phận của @@templates mà bạn cần khi đang di chuyển.

+0

Hmm. Tôi chắc chắn không muốn giới thiệu bất kỳ phụ thuộc bổ sung nào vào ứng dụng một cách không cần thiết. Tôi * đã sử dụng ActiveRecord, nhưng tôi không thích ý tưởng thay đổi cơ sở dữ liệu khi ứng dụng bắt đầu; Tôi cảm thấy như có thể có một vấn đề nếu hai dynos (tôi đang ở trên Heroku) bắn lên cùng một lúc. – coreyward

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