2012-02-02 43 views
27

Sau khi nâng cấp lên đường ray3.2.1, cảnh báo này xảy ra:Cách xử lý nhà cung cấp/bổ sung sau khi nâng cấp lên đường ray 3.2.1

Bạn có Rails 2.3-style plugins trong vendor/plugins! Hỗ trợ cho các plugin này sẽ bị xóa trong Rails 4.0. Di chuyển chúng ra và gói chúng trong Gemfile của bạn, hoặc gấp chúng vào ứng dụng của bạn dưới dạng lib/myplugin/* và config/initializers/myplugin.rb. Xem ghi chú phát hành để biết thêm về điều này: http://weblog.rubyonrails.org/2012/1/4/rails-3-2-0-rc2-has-been-released

Tôi di chuyển plugin của mình trong thư mục vendor/plugins nhưng tôi không biết cách viết tệp config/initializers/myplugin.rb và google không thể tìm thấy câu trả lời.

Trả lời

43

tôi chỉ viết một bài đăng blog về vấn đề này: How to Convert Simple Rails 2.3 Style Plugins for Rails 3.2

+1

Cảm ơn rất nhiều bài đăng trên blog của bạn! Tôi vừa chuyển đổi thành công [gmail_smtp] (https://github.com/adamwiggins/gmail_smtp/) bằng cách sử dụng các hướng dẫn tuyệt vời của bạn. Trong trường hợp nó giúp bất cứ ai, tôi đã thay đổi hai dòng trong 'init.rb' ban đầu từ' require 'smtp_tls'' và 'require' actionmailer_gmail'' thành' require File.dirname (__ FILE__) + '/../ ../lib/gmail_smtp/smtp_tls'' và 'yêu cầu File.dirname (__ FILE__) + '/../../ lib/gmail_smtp/actionmailer_gmail'' tương ứng. – user664833

+0

Liên kết đã chết, bạn có thể vui lòng đăng một liên kết mới @coneybeare không. –

+0

liên kết không hoạt động: ( –

8

Tôi chỉ đi qua đây và thấy rằng bạn chỉ phải đi qua từng plugin để kiểm tra một vài điều:

  • Có một viên ngọc trên rubygems? Nếu vậy, chỉ cần dính vào nó trong Gemfile của bạn và xóa từ vendor/plugins
  • Nếu không có đá quý có sẵn, hoặc đá quý trở về già, đi thư mục trong vendor/plugins và di chuyển nó đến lib/plugins

Một điều tôi chạy qua là sau đó bạn cần phải yêu cầu tất cả các plugin đó theo cách thủ công. Dưới đây là initializer tôi tạo ra và đặt trong 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 

Tôi cũng đã là vấn đề của initializers tôi cần cho một số các plugin, vì vậy tôi đã chuyển những initializers đặc biệt vào thư mục lib/plugins/initializers. Bạn phải đặt tên cho chúng là tên của plugin, do đó, trình khởi tạo cho plugin my_plugin sẽ phải nằm trong tệp lib/plugins/initializers/my_plugin.rb

Hy vọng điều này sẽ hữu ích!

+0

Và điều gì sẽ xảy ra nếu một người đã ghi đè bộ điều khiển của một viên ngọc , làm thế nào để di chuyển đó để lib? –

7

cả hai câu trả lời khác đều tốt và dường như hoạt động.

Tuy nhiên nếu plugin của bạn bao gồm một tập tin rb đơn dưới nhà cung cấp/plugins /.../ lib và các nhà cung cấp/plugins /.../ init.rb chỉ là một

require 'pluginname' 

Sau đó, bạn chỉ đơn giản là có thể sao chép các tập tin vào thư mục lib của bạn và thêm một tập tin vào config/initializers mà yêu cầu 'yourpluginname'

Đây là một ví dụ cụ thể bằng cách sử dụng plugin actions_as_rated mà không phải là một viên ngọc.

  1. nhà cung cấp bản sao/plugins/acts_as_rated/lib/acts_as_rated.rb để lib/
  2. tạo một file config/initializers/acts_as_rated.rb với những điều sau ...

    require 'acts_as_rated'

  3. xóa vendor/plugins/acts_as_rated

+0

Tôi đã sử dụng mẹo này để có được ssl_requirement từ nhà cung cấp lên đến lib. – Nungster

0

Không ai có đề cập đến một chuyển đổi Railt tức là hoặc Rails :: Engine.

Chỉ cần di chuyển tất cả các tệp ruby ​​của bạn thành đá quý [sử dụng đá quý bó để tạo thành ma sát tối thiểu].

Sau đó, có một cái nhìn tại các tài liệu Railtie [và tìm mục tiêu của bạn Rails phiên bản]:

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

Đó là khá dễ dàng để chuyển đổi chỉ một plugin cũ init.rb đến một railtie theo cách này, và nó cung cấp cho bạn một lộ trình để Rails 4+.

Có chế độ xem hoặc bộ điều khiển ?, sau đó sử dụng công cụ Rails :: Engine. Trong khi động cơ trong đá quý có thể phức tạp từ quan điểm dòng công việc, thì việc chuyển đổi plugin thành một công cụ khá tầm thường.

Tự làm một việc và bắt đầu xây dựng các bài kiểm tra ngay trong đá quý, thay vì trong dự án Rails.

Các vấn đề liên quan