【问题标题】:Reload Rails 3 initializer in development mode在开发模式下重新加载 Rails 3 初始化程序
【发布时间】:2011-02-07 18:21:38
【问题描述】:

我正在构建一个 Rails 3 应用程序,用户可以在其中选择多个模板中的一个并构建一个小网站。我正在尝试在应用程序启动时初始化所有可用的模板。这本质上是一个让我定义它们的文件,然后为它们中的每一个调用Template.add(template),然后将它们存储在@@templates中,我可以通过Template.find(name)访问它们。

问题在于,在开发模式下,我调用Template.add 的初始化程序在第一个请求时被加载,然后在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,尤其是在配置方面。

我暂时通过在类中加载数据来避免这个问题。把我从这种丑陋的、非模块化的肮脏中拯救出来。

【问题讨论】:

  • 我不确定我是否明白了你的问题。所以只是一个建议:你为什么不自动加载你的文件? hemju.com/2010/09/22/…
  • 确实不熟悉这个过程,但无论如何它并不能解决我的问题。每次请求都会重新加载模板模型(cache_classes = false 在开发中)并且我的模板文件不会重新加载,因此在第二个请求中没有任何模板“注册”到模板模型。
  • 你能解释一下为什么你认为这不适用于 to_prepare 吗?
  • 这可能值得一看,因为它有很多关于初始化过程的细节:guides.rubyonrails.org/initialization.html
  • 当我使用 to_prepare 第一次运行时加载的所有内容,然后再没有。我想这是因为我使用的是require 而不是load

标签: ruby-on-rails ruby ruby-on-rails-3


【解决方案1】:

我认为你应该能够使用 config.to_prepare 来执行此操作,如果你将调用 Template.addtemplate_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 类的末尾建议调用 Template.load_all,你甚至可能不需要 config.to_prepare 部分。

【讨论】:

  • 当我遇到这个问题时我不知道config.to_prepare,并且自从我发布这个问题以来并没有考虑太多,但我认为这会很好用为了我。有时间我会尝试一下,如果有的话,我会接受。
【解决方案2】:

如何将模板名称的查找存储到它们的文件中,比如 memcached 或 Redis,甚至是数据库中。初始化程序可以加载内存存储或确保数据库是最新的所有值,然后Template.find 可以查看存储以查看文件的位置,或者甚至只是获取类名(如果它们是)已经要加载了。只需查看是否定义了类名就可以告诉您是否需要模板文件或直接创建新实例。

基本上将@@templates 存储在rails 进程内存之外,或者至少存储足够的信息,以便您可以即时构建您需要的@@templates 部分。

【讨论】:

  • 嗯。我绝对不想在应用程序中不必要地引入任何额外的依赖项。我曾经使用 ActiveRecord,但我不喜欢在应用程序启动时更改数据库的想法;我觉得如果两个测功机(我在 Heroku 上)同时启动,可能会出现问题。
猜你喜欢
  • 2011-08-02
  • 2012-06-18
  • 2013-04-18
  • 1970-01-01
  • 1970-01-01
  • 2012-08-15
  • 2012-02-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多