2013-12-30

railsのプラグインを作ってみた

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
railsのプラグインを作ってみました。

実際に作った手順を簡単に記録しておこうと思います。

作ったのは、railsのアクセスログをdbに保存するというものです。
after_filterでlogsテーブルに記録をするというだけのものです。

とりあえず名前はrails_acclog2dbとします。
githubに実際に作ったものを置いてみました。
https://github.com/vivahiraj/rails_acclog2db


まずは雛形を作ります。

rails plugin new rails_acclog2db -T --skip-bundle --dummy-path=spec/dummy

それぞれのオプションは
-T:テスト用ファイルの作成をスキップ(後でrspecを利用するようにします)
--skip-bundle:コマンド直後にbundle installを実行しない
--dummy-path:作ったプラグインを試すためのrails環境の場所を指定

cd rails_acclog2db


続いてrspecの設定を行います。

vi rails_acclog2db.gemspec


rspec-railsとammeterを追加します。
ammeterはgeneratorのspecを作成する際に利用します。

関連するgemをvendor配下にインストールするように設定します。(必須ではないです)

mkdir .bundle
vi .bundle/config

内容は以下のような感じです。
------------------------------
BUNDLE_PATH: vendor/bundle
BUNDLE_DISABLE_SHARED_GEMS: "1"
------------------------------

gemをインストールします。

bundle install

rspec用のファイルを生成します。

cd spec/dummy
ln -s ../../spec
rails generate rspec:install
cd -
cp spec/dummy/.rspec .

spec_helperを修正します。

vi spec/spec_helper.rb




environmentの読込先を変更してammeter/initを追加します。


今回はログの記録先としてlogsテーブルに保存したいので、migrationとmodelをrails generateで実行できるようにするために専用のgeneratorを作成してみます。

まずはgeneratorでコピーするファイルを保存するディレクトリを作成します。
mkdir -p lib/generators/rails_acclog2db/install/templates

コピーするモデルを作成します。

vi lib/generators/rails_acclog2db/install/templates/log.rb

コピーするマイグレーションを作成します。

vi lib/generators/rails_acclog2db/install/templates/create_logs.rb

ジェネレーターを作成します。

vi lib/generators/rails_acclog2db/install/install_generator.rb

だいたいこんな感じがお決まりのようです。

ジェネレータのspecも作成してみます。

mkdir -p spec/generators/rails_acclog2db/install

vi spec/generators/rails_acclog2db/install/install_generator_spec.rb

specが成功することを確認してみます。
bundle exec rspec spec


実際にジェネレートできるかテスト用のrails環境で試してみます。
cd spec/dummy/
rails g rails_acclog2db:install

実際にmigrationもできるか試します。
rake db:migrate
rake db:migrate RAILS_ENV=test

cd ../../

作成されたLogモデルのspecも作ってみます。

mkdir spec/models
vi spec/models/log_spec.rb
specが成功することを確認してみます。
bundle exec rspec spec


つづいてメインの部分でlogを記録する部分です。
controllerにaccess_loggingと書いたら、そのcontrollerへのログを記録するようにしてみます。
sessionに:userが設定されていたら、きっと何かしらの認証がされたと思い込んで、それっぽい情報を保存するようにもします。

vi lib/rails_acclog2db/logging.rb

ActiveSupport::Concernをextendするとモジュールで取り込まれるclassメソッドとかインスタンスメソッドがちょっとすっきりかけるようです。

上記のファイルをrequireできるようにします。

vi lib/rails_acclog2db.rb 



実際にテスト用のrails環境のcontrollerに組み込んでみてspecを作成してみます。

まずはcontrollerを準備します。

cd spec/dummy
rails g controller welcome
touch app/views/welcome/index.html.erb

vi app/controllers/welcome_controller.rb



vi config/routes.rb



次にspecを作成します。
cd ../../

vi spec/controllers/welcome_controller_spec.rb

specが成功することを確認してみます。
bundle exec rspec spec


これが普通な作り方なのかはよくわからないのですが、こんな感じでできました。


以下が参考になりました。
http://guides.rubyonrails.org/v3.2.14/plugins.html
http://d.hatena.ne.jp/kouji0625/20130523/p1
http://d.hatena.ne.jp/kouji0625/20130524/p1
コメントを投稿