Rails用のgemを作成する手順 (Rails 4.0以降)
railsで使用されることを前提としたgemの開発手順です。いつもコマンドとかオプションを忘れてしまうので、備忘録として記述しておきます。
ディレクトリ作成
まずは rails pluginコマンドでgem開発用ディレクトリを作成します。
1 2 3 | $ bundle exec rails plugin new <プラグイン名> --full --skip-bundle ヘルプが見たい場合は $ bundle exec rails plugin new --help |
--skip-bundleがないと、 bundle installが走ってしまいます。パス指定せずにインストールすると、グローバル環境を壊してしまう可能性があるので、各開発ディレクトリにインストールしてます。
1 2 | $ cd <プラグイン名> $ bundle install --path=vendor/bundle |
あとは直下の プラグイン名.gemspecファイルを編集して開発を始められます。
テスト用railsアプリ
testディレクトリ以下にdummyというディレクトリが作成されています。通常のrailsアプリなので、こいつにプラグインgemを読み込んでテストすることになります。
このテスト用アプリ(dummy)は、以下のようにして起動することができます。
1 2 | $ cd test/dummy $ bin/rails s |
プラグインgemのJavascriptを読み込む
普通に読み込むことができます。例えば プラグインディレクトリ/app/assets/javascripts/hoge.jsというJavascriptを作成し、この内容をdummyに読み込みたい場合は、 test/dummy/app/assets/javascripts/application.jsに
1 2 | //= require hoge //= require_tree . |
てな感じで書いてやればいいです。
ActionController::Baseを拡張する
プラグインgemを読み込むだけで、他に何もしなくても、すべてのコントローラで使用できるメソッドを追加したい場合があります。そういった場合はActionController::Baseを拡張してやればいいです。
ActiveSupport.on_loadを使用すれば、モジュールの読み込み処理をフックすることができます。そのモジュールが読み込まれたタイミング、もしくは既に読み込まれていれば即時に、特定の処理を実行できます。
プラグインディレクトリ/lib/プラグイン名/engine.rbを編集します。例として、 awesome_gemという名前のgemを開発中で、 NiceModuleというナイスなモジュールをインクルードするとします。
1 2 3 4 5 6 7 8 9 10 11 12 | require 'awesome_gem/nice_module.rb' # プラグインディレクトリ/lib/awesome_gem/nice_module.rb module AwesomeGem class Engine < ::Rails::Engine initializer 'awesome_gem.action_controller_extension' do ActiveSupport.on_load :action_controller do # p self #=> ActionController::Base include AwesomeGem::NiceModule end end end end |
railsのApplicationControllerはActionController::Baseを継承してますので、NiceModule内のメソッドは、すべてのコントローラで使用できるというわけです。
他にも思いついたら追記していきます。
関連する記事
- 【実践】Railsにて検索結果をそのままCSV出力する(やや手抜きで)
- ポップアップブロックを回避してsubmitと同時に新しいウィンドウを開く
- rubocop + pre-commitで規約違反のコードをコミットできないようにする
- AngularJS + Railsで国際化(i18n)
- Rails+JSフレームワークでリアルタイム掲示板を作成してみる(AngularJS編)