我最近从resources_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我已经在我的一个初始化器中添加了一个require 'resources_controller',它可以正确地加载这个文件。问题是,尽管计算了Railtie (类块中的puts将命中),但它似乎从未真正调用初始化器块本身。这当然很重要,因为这是它扩展ActionController以包含resources_controller_for方法的地方。
这个问题似乎已经出现在here和here上了。尽管在这两种情况下,他们都找到了解决问题的其他方法,但没有直接回答为什么没有调用该块。
从我在Rails文档中可以看出,你可以给你的初始化程序块命名任何你喜欢的名称,并且它应该会运行。我认为这无关紧要,但我第一次注意到这个问题是在生产rails s -e production中,尽管我相信在开发模式下也存在同样的问题。
可能发生了什么?
作为参考,完整的插件在这里:https://github.com/ianwhite/resources_controller
发布于 2011-12-10 14:13:19
这里的问题是,一旦初始化器进程启动,就不能添加新的初始化器。
在这里,您需要在初始化器过程中注册初始化器的代码。当您在Gemfile中使用gem时,初始化器在以下代码中注册:
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_controller代码,该文件在初始化过程中运行。因此,注册新的初始化器已经太晚了。
使情况变得复杂的是,vendor/plugins内部的加载路径也是在初始化过程中设置的,因此您无法在application.rb中要求使用resources_controller。
对您的问题最简单的解决方案是使用bundler中的:path特性。安装插件后,将这一行添加到Gemfile中:
gem 'resources_controller', :path => "vendor/plugins/resources_controller"然后,您可以从初始化器中删除require行,bundler将识别出该插件是一个本地签出的gem,并执行如果使用git它会执行的操作。
https://stackoverflow.com/questions/7422818
复制相似问题