28

After upgrading to rails3.2.1,this warning occurs:

You have Rails 2.3-style plugins in vendor/plugins! Support for these plugins will be removed in Rails 4.0. Move them out and bundle them in your Gemfile, or fold them in to your app as lib/myplugin/* and config/initializers/myplugin.rb. See the release notes for more on this: http://weblog.rubyonrails.org/2012/1/4/rails-3-2-0-rc2-has-been-released

I move my plugins in vendor/plugins directory but i don't know how to write config/initializers/myplugin.rb file, and google can't find the answer.

4

4 回答 4

43

我刚刚写了一篇关于此的博客文章:How to Convert Simple Rails 2.3 Style Plugins for Rails 3.2

于 2012-02-02T16:16:31.103 回答
8

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

  • 它是红宝石上的宝石吗?如果是这样,只需将其粘贴到您的 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

希望这可以帮助!

于 2012-02-08T20:22:59.450 回答
7

其他两个答案都很好并且似乎有效。

但是,如果您的插件由 vendor/plugins/.../lib 下的单个 .rb 文件组成,并且 vendor/plugins/.../init.rb 只是一个

require 'pluginname'

然后你可以简单地将单个文件复制到你的 lib 目录并将一个文件添加到 config/initializers 中,它需要'yourpluginname'

这是一个使用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. 删除供应商/插件/acts_as_rated

于 2012-02-09T08:29:03.560 回答
0

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

只需将所有 ruby​​ 文件移动到 gem [使用 bundle gem 创建它以减少摩擦]。

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

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

以这种方式将旧插件 init.rb 转换为 railtie 非常容易,它为您提供了通往 Rails 4+ 的途径。

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

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

于 2017-12-06T09:59:49.987 回答