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

时间:2012-02-02 05:22:17

标签: ruby-on-rails plugins warnings ruby-on-rails-3.2

升级到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

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

4 个答案:

答案 0 :(得分:43)

答案 1 :(得分:8)

我刚刚经历过这个,发现你只需要浏览每个插件来检查一些事情:

  • 它是rubygems的宝石吗?如果是这样,只需将其粘贴在您的Gemfile中并从vendor/plugins
  • 中删除即可
  • 如果没有可用的宝石,或宝石已旧,请取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

希望这有帮助!

答案 2 :(得分:7)

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

但是,如果您的插件包含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

答案 3 :(得分:0)

没有人提到转换为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中构建测试,而不是在Rails项目中。