Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/codeigniter/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 3 在开发模式下,在每个请求上重新加载*文件之后,如何连接到Rails*?_Ruby On Rails 3 - Fatal编程技术网

Ruby on rails 3 在开发模式下,在每个请求上重新加载*文件之后,如何连接到Rails*?

Ruby on rails 3 在开发模式下,在每个请求上重新加载*文件之后,如何连接到Rails*?,ruby-on-rails-3,Ruby On Rails 3,我正在开发一个基于用户配置选项动态设置ActiveRecord模型(如表\u name)属性的应用程序 我有一个初始化器实现了这一点。然而,我的问题是,在开发模式下,这些类会被重新加载,所以它们不会维护这些设置的值 所以我想我应该使用railtie来钩住这些文件被重新加载的点,然后在模型上再次运行我的配置。然而,我的问题是,railtie中的config.to_prepare似乎在重新加载之前运行实际发生。我可以通过一些日志来证明这一点: module MyMod class Railtie

我正在开发一个基于用户配置选项动态设置ActiveRecord模型(如
表\u name
)属性的应用程序

我有一个初始化器实现了这一点。然而,我的问题是,在开发模式下,这些类会被重新加载,所以它们不会维护这些设置的值

所以我想我应该使用railtie来钩住这些文件被重新加载的点,然后在模型上再次运行我的配置。然而,我的问题是,railtie中的
config.to_prepare
似乎在
重新加载之前运行实际发生。我可以通过一些日志来证明这一点:

module MyMod
  class Railtie < Rails::Railtie

    config.to_prepare do
      Rails.logger.debug("Contact object_id: #{Contact.object_id}")
    end
  end
end
如果我选中
Contact.object\u id
它匹配:

Contact.object_id  #=> 2202692040
然后我
重新加载

reload!
Rails logger从my
到_prepare
日志:

Contact object_id: 2202692040
所以它仍然有旧的object_id,但是当我在控制台中检查它时:

Contact.object_id  #=> 2197355080
这是新加载的类对象id

那么,如何让
在重新加载文件后准备运行
?使用
Rails 3.0.10

更新 我还尝试手动将此操作附加到
ActionDispatch::Callbacks
上的
after\u prepare
回调,如下所示:

initializer "apartment.init" do
  ActionDispatch::Callbacks.set_callback(:prepare, :after) do
    Rails.logger.debug("Contact object_id: #{Contact.object_id}")
  end
end

它确实在
config.to_prepare
之后运行回调,但在文件重新加载之前,它似乎仍然会发生
。。。我得到了与上面相同的行为。

我相信Rails重载程序只会卸载常量。在应用程序中引用常量时,模型会自动加载

在回调中,我认为您必须通过引用所有模型手动触发加载。也许你的gem可以保留一个包含它的所有模型的列表,然后只需引用常量就可以自动加载它们

model_names.each { |model_name| model_name.constantize }
您可以使用以下内容构建列表:


编写一个初始值设定项,如果
cache\u classes
false
,则使用该初始值设定项设置
以准备运行gem安装例程的回调

initializer 'foobar.install' do
  if Rails.configuration.cache_classes
    FooBar.install!
  else
    ActionDispatch::Reloader.to_prepare do
      FooBar.install!
    end
  end
end

它可以在控制台中使用
重新加载方法和在Rack application server中。

您是否尝试过类似于
在缓存类时准备
,所以您可以只做:{ActionDispatch::Reloader.to_prepare do FooBar.install!end}初始值设定项对我不起作用,但我删除了它,它起了作用,在文档中很难找到这样的东西,感谢新的Rails版本5.x,我们需要使用
ActiveSupport::Reloader.to_prepare
而不是
ActionDispatch::Reloader.to_prepare
为新的Rails版本6.x,我们现在必须使用
Rails.application.reloader.to_prepare
而不是
ActiveSupport::reloader.to_prepare
module MyGem
  self.included(base)
    @model_names ||= Set.new
    @model_names += base.to_s
  end
end
initializer 'foobar.install' do
  if Rails.configuration.cache_classes
    FooBar.install!
  else
    ActionDispatch::Reloader.to_prepare do
      FooBar.install!
    end
  end
end