升级到rails 3.2.1后如何处理供应商/插件

升级到rails3.2.1后,会出现此警告:

你在供应商/插件中有Rails 2.3风格的插件! 在Rails 4.0中将删除对这些插件的支持。 将它们移出并将它们捆绑在Gemfile中,或者将它们作为lib / myplugin / *和config / initializers / myplugin.rb折叠到您的应用程序中。 有关详细信息,请参阅发行说明: http : //weblog.rubyonrails.org/2012/1/4/rails-3-2-0-rc2-has-been-released

我在plug / plugins目录中移动我的插件,但我不知道如何编写config / initializers / myplugin.rb文件,谷歌找不到答案。

我刚写了一篇博文: 如何转换Rails的简单Rails 2.3样式插件3.2

我刚刚完成了这个,发现你只需要通过每个插件来检查一些事情:

  • 它是rubygems的gem吗? 如果是这样,只需将其粘贴在您的Gemfile中并从vendor/plugins删除即可
  • 如果没有可用的gem,或者gem是旧的,请使用vendor/plugins的文件夹并将其移动到lib/plugins

我碰到的一件事是你需要手动要求所有这些插件。 这是我创建的初始化程序并放在config/initializers/plugins.rb

 Dir[Rails.root.join('lib', 'plugins', '*')].each do |plugin| next if File.basename(plugin) == 'initializers' lib = File.join(plugin, 'lib') $LOAD_PATH.unshift lib begin require File.join(plugin, 'init.rb') rescue LoadError begin require File.join(lib, File.basename(plugin) + '.rb') rescue LoadError require File.join(lib, File.basename(plugin).underscore + '.rb') end end initializer = File.join(File.dirname(plugin), 'initializers', File.basename(plugin) + '.rb') require initializer if File.exists?(initializer) end 

我也遇到了一些插件所需的初始化程序问题,因此我将这些特定的初始化程序移动到了lib/plugins/initializers文件夹中。 你必须将它们命名为插件的名称,因此my_plugin插件的初始化程序必须位于文件lib/plugins/initializers/my_plugin.rb

希望这可以帮助!

其他答案都很好,似乎有效。

但是,如果你的插件包含vendor / plugins /…/ lib下的单个.rb文件,那么vendor / plugins /…/ init.rb只是一个

 require 'pluginname' 

然后,您只需将单个文件复制到lib目录,然后将文件添加到需要’yourpluginname’的config / initializers中

这是一个使用acts_as_rated插件的具体示例,该插件还不是gem。

  1. 将vendor / plugins / acts_as_rated / lib / acts_as_rated.rb复制到lib /
  2. 使用以下命令创建文件config / initializers / acts_as_rated.rb …

    要求’acts_as_rated’

  3. 删除vendor / plugins / acts_as_rated

没有人提到转换为Railtie或Rails :: Engine。

只需将所有ruby文件移动到gem中[使用bundle gem创建它以获得最小的摩擦]。

然后看看Railtie文档[并找到你的目标Rails版本]:

https://apidock.com/rails/v3.2.13/Rails/Railtie

通过这种方式将旧的插件init.rb转换为铁路很容易,它为您提供了通往Rails 4+的途径。

有视图或控制器?,然后使用Rails :: Engine。 虽然gem中的引擎从工作流的角度来看可能很复杂,但将插件转换为一个插件非常简单。

帮自己一个忙,并开始在gem中构建测试,而不是在Rails项目中。