簡體   English   中英

在開發模式下重新加載Rails 3初始化程序

[英]Reload Rails 3 initializer in development mode

我正在構建一個Rails 3應用程序,用戶可以從中選擇一個模板並構建一個小網站。 我正在嘗試在應用程序啟動時初始化所有可用模板。 這本質上是一個文件讓我自己定義它們,然后為每個文件調用Template.add(template) ,然后將它們存儲在@@templates ,我可以通過Template.find(name)訪問它們。

問題是在開發模式下,我對Template.add進行調用的初始化程序在第一次請求時被加載,然后在reload!被清除reload! 我已經閱讀了有關config.to_prepare ,但它對我不起作用,可能是因為我需要這樣的模板:

# 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

重裝后,我該怎么做才能重新加載這些文件reload! 或者讓他們完全沒有遭受破壞? 此外,如果你有一個更好的方法來處理這個問題的建議,我會全力以赴。 我仍然在使用Rails,特別是在配置方面。

我通過在類中加載數據暫時避免了這個問題。 讓我遠離這種丑陋,非模塊化的骯臟。

如何將模板名稱的查找存儲到memcached或Redis等內存存儲中的文件中,甚至存儲在數據庫中。 初始化程序可以加載內存存儲庫或確保數據庫是最新的所有值,然后Template.find可以只查看商店以查看文件的位置,或者甚至只是獲取類名稱(如果它們是已經裝好了。 只需查看是否定義了類名,就可以告訴您是否需要模板文件,或者只是繼續創建新實例。

基本上將@@templates存儲在rails進程內存之外,或至少提供足夠的信息,您可以構建動態需要的@@templates部分。

我認為你應該能夠使用config.to_prepare來執行此操作,如果你將Template.add調用Template.add調用template_name.rb (我認為它就是現在的位置),並且放入加載代碼中require 例如,考慮將此類方法添加到Template類中,然后甚至可能在第一次加載時從類本身調用它:

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

然后從他們自己注冊的template_name.rb文件中刪除Template.add(name)代碼。 (再次,我假設這是當前發生的地方 - 我從你的原始帖子中我不太清楚。)或者你可能只是想確保Template.add是冪等的並且默默地丟棄重復項。

最后,將以下內容添加到config/environments/development.rb

config.to_prepare do
  Template.load_all
end

這將在Template類重新加載后重新加載所有模板。

我沒有試過,但與調用Template.load_all我在結束建議Template類,你可能甚至不需要config.to_prepare部分。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM