Ruby on rails Railtie初始值设定项未在插件中运行
我最近从Ruby on rails Railtie初始值设定项未在插件中运行,ruby-on-rails,ruby-on-rails-3,ruby-on-rails-plugins,railtie,Ruby On Rails,Ruby On Rails 3,Ruby On Rails Plugins,Railtie,我最近从resources\u controller的gem版本切换到plugin,因为gem版本依赖于git 在vendor/plugins/plugin/lib/plugin.rb文件中,Railtie如下所示: module Ardes module ResourcesController class Railtie < Rails::Railtie initializer 'ardes.resources_controller' do Act
resources\u controller
的gem版本切换到plugin
,因为gem
版本依赖于git
在vendor/plugins/plugin/lib/plugin.rb
文件中,Railtie
如下所示:
module Ardes
module ResourcesController
class Railtie < Rails::Railtie
initializer 'ardes.resources_controller' do
ActiveSupport.on_load(:action_controller) do
extend Ardes::ResourcesController
include Ardes::ResourcesController::RequestPathIntrospection
end
ActiveSupport.on_load(:active_record) do
include Ardes::ActiveRecord::Saved
end
end
end
end
end
模块ARDS
模块资源控制器
类Railtie
我在一个初始值设定项中添加了一个require'resources\u controller'
,它正确地加载了这个文件。问题在于,尽管对Railtie
进行了计算(将放入类块中的),但它似乎从未真正调用初始值设定项块本身。这当然很重要,因为这是它扩展ActionController
以包括resources\u controller\u for
方法的地方
这个问题似乎已经提出来了。尽管在这两种情况下,他们都找到了解决问题的其他方法,但没有给出直接的答案来解释为什么没有调用该块
根据我在Rails文档中的介绍,您可以命名您的初始值设定项块(initializer block),只要您愿意,它就应该运行。我不认为这有什么关系,但我首先注意到问题是在生产rails s-e生产中运行的,尽管我相信在开发模式中也存在同样的问题
可能发生了什么
这里有完整的插件供参考:您在这里遇到的问题是,一旦初始化程序进程开始,您就不能添加新的初始化程序
这里,您需要在初始化过程中注册初始化器的代码。在GEM文件中使用gems时,初始值设定项将在以下代码中注册:
if defined?(Bundler)
# If you precompile assets before deploying to production, use this line
Bundler.require(*Rails.groups(:assets => %w(development test)))
# If you want your assets lazily compiled in production, use this line
# Bundler.require(:default, :assets, Rails.env)
end
此代码在初始值设定项开始之前执行。相反,您需要初始化程序文件中的resources\u controller
代码,该文件在初始化过程中运行。因此,注册新的初始值设定者为时已晚
使情况复杂化的是,供应商/插件
中的加载路径也在初始化过程中设置,因此您将无法在application.rb
中要求资源\u控制器
解决问题的最简单方法是使用bundler中的:path
功能。安装插件后,将以下行添加到您的文件:
gem 'resources_controller', :path => "vendor/plugins/resources_controller"
然后,您可以从初始值设定项中删除require行,bundler将识别出该插件是一个本地签出的gem,并执行使用git时的操作。谢谢您的回答。最后我做了这件事,但忘了回来回复。感谢您提供的描述性回答,因为它有助于了解有关初始化过程的更多信息。