相关疑难解决方法(0)

如何防止初始化程序配置在开发模式中丢失?

我正在使用一个使用引擎的Rails应用程序.我正在使用初始化程序来配置我的引擎的一个控制器,以便它在主机应用程序中触发一个动作.代码看起来像这样:

# config/initializers/my_engine.rb
MyEngine::SomeController.after_filter proc {
  # Do something in the host app
}, :only => :update
Run Code Online (Sandbox Code Playgroud)

这在生产中工作正常,但在开发模式下,proc仅在第一个请求时调用.这是因为类被重新加载并且此配置丢失,因为它存储在类变量中.(例如,MyEngine::SomeController从它所在的文件重新加载,并且由于after_filter未在那里声明,因此不会重新加载它.)

一些Rails背景

在开发模式下,Rails使用以下加载策略:

  • app如果您正在主动更改目录,则会在每个请求上重新加载目录中的代码.
  • 当应用程序启动时,lib目录中的代码以及config/initializer文件将加载一次.

初始化程序文件通常用于配置gem.在过去,gems主要在lib目录中有代码,因此运行一次配置就足够了.

引擎如何改变事物

但是,Rails引擎在app目录中有代码:控制器,模型等.这些文件在每个请求的开发模式下重新加载.因此,上面的示例配置丢失了.

输入to_prepare

Rails config.to_prepare专门解决了这个问题:它在生产中运行一次,在开发中的每个请求上运行一次.

例如,我们在application.rb中有这个,它工作正常:

config.to_prepare do
  # set up class variables (after_filters, etc)
end
Run Code Online (Sandbox Code Playgroud)

但是,如果我必须将所有引擎的配置都放入其中application.rb,这就会破坏config/initializers保持组织有序性的观点.

因此,对于我的引擎app目录中的任何类配置,我想将该代码放在文件下config/initializers.

这是我的问题.

  • 我不清楚如何config进入初始化文件中的范围.我在想它会Rails.application.config.是对的吗?
  • 我可以添加多个to_prepare块吗?我担心多次调用它会覆盖以前的块.

更新

正如@Frederick Cheung所提到的,Rails.application.config.to_prepare它可以在config/initializer …

ruby-on-rails ruby-on-rails-3.1

19
推荐指数
1
解决办法
4133
查看次数

标签 统计

ruby-on-rails ×1

ruby-on-rails-3.1 ×1