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时的操作。

谢谢您的回答。最后我做了这件事,但忘了回来回复。感谢您提供的描述性回答,因为它有助于了解有关初始化过程的更多信息。