unshiuの各機能としての作成したプラグインの共通ルールをまとめます。 基本ルールプラグインごとに接頭詞をもち、関係ファイル、ディレクトリにはかならず接頭詞をつけます。 例) base_user dia_entry以下が一覧です。 | パッケージ名 | パッケージ略称(接頭詞) | パッケージの役割 | | ユーザ管理 | base | ユーザ管理の基本となるパッケージ | | プロフィール | prf | プロフィールの記述・閲覧 | | メッセージ | msg | メッセージの送受信やゴミ箱など | | ポイント | pnt | ユーザにポイントの付与や履歴を残す | | 日記 | dia | 日記の記述・閲覧や公開レベルを設定する | | アルバム | abm | 画像のアルバム、画像へのコメントや説明、アルバム単位の公開レベルを設定する | | コミュニティ | cmm | コミュニティの作成・公開レベルの設定、トピックの作成・コメントができるようにする | | メールマガジン | mlg | メールマガジンをユーザに送信したり、送信結果を確認できる | | mixiアプリ | mixi | mixiアプリ関連 | | 管理 | mng | 管理機能全般
|
以降、本稿では plugin_name という記述をした場合、接頭詞の名前を指します。 プラグイン構成全てのプラグインは以下の構成になっています #{plugin_name}/db/migrate # migrationファイル /generators/#{plugin_name}/#{plugin_name}_generator.rb /templates/ # generateした際にコピーするファイルを置きます。 /lib/#{plugin_name}/ # module化したライブラリを置きます /test # module化したテスト系を置きますプラグイン作成方法前提プラグイン化の条件は unit, functional, 最低限の integration テストが書かれていることが必須です。 プラグイン管理generatorをインストール$ ruby script/plugin install git://github.com/unshiu/peeled-unshiu-plugin-template-generator.gitプラグインの雛形を作成$ ruby script/plugin generate #{plugin_name}UnshiuPluginTemplateGeneratorの実行$ ruby script/generate unshiu_plugin_template_generator #{plugin_name}
UnshiuPluginTemplateGeneratorは指定された接頭詞のファイルを以下のディレクトリにコピーする機能を持っています。 #{RAILS_ROOT}/vendor/#{plugin_name}/generators/#{plugin_name}/templates module化module化は一番最初にプラグインを作成するときのみ必要な作業です。プラグイン作成後は必要に応じて手動でmoduleを追加することになります。 - templates/app 以下にコピーされたファイルのうち拡張子が .rb のものを lib 以下にコピー
UnshiuPluginTemplateGeneratorによって必要ファイルはコピーされました。このうちmodule化が必要な .rb ファイルのみ lib に移動します。 - templates/test 以下にコピーされたファイルのうち拡張子が .rb のものを test 以下にコピー
templates/app 以下と同様です。 先にtestをmodule化します。作業としては以下のようになります。 - 定義を class から module に変更
- 末尾にModuleを加える
- 継承は削除する
module HogeTestModule
class << self def included(base) # モジュールをクラスメソッドとして追加する base.extend(ClassMethods)
base.class_eval do # fixtures などクラスメソッドの呼び出し # ex) fixtures :hoges end end end
# テストメソッド def test_hoge end
end- templates/test 以下のファイルはmoduleをincludeするようにする
require File.dirname(__FILE__) + '/../../vendor/plugins/plugin_name/test/functional/hoge_test.rb'
class Hoge < Test::Unit::TestCase include hogeTestModule endこの時点でまずテストが通ることを確認してください。 作業としてはtestのmodule化と同様に以下のようになります。 - 定義を class から module に変更
- 末尾にModuleを加える
- 継承は削除する
module HogeModule
class << self def included(base) # モジュールをクラスメソッドとして追加する base.extend(ClassMethods)
base.class_eval do # before_filter などクラスメソッドの呼び出し # ex) before_filter :login_required
# 定数はメソッド内で定義できないので const_set を使って宣言 # const_set('CONST_NAME', ...) # ex) # const_set('SIZE', 10)
# 特殊な処理が必要な場合 # ・この領域で ActionController や ActiveRecord の定数を利用している # ⇒フルネームで書く # ・この領域で定義した定数をこの領域内で利用している # ⇒base:: をつける # ex) # base::STATUS_ACTIVE end end end
module ClassMethods # クラスメソッドは classMethods内に定義する # self がついている場合はselfを削除すること end
end- templates 以下のファイルはmoduleをincludeするようにする
class Hoge < ActiveRecord::Base include hogeModule end対象クラスのテストが通ることを確認してください。うまく通らない場合はmodule化になにかしら問題が発生しています。 db/migrate 以下に関連するmigrateファイルをコピーします。 一番最初にplugin化する際は最終的なバージョンのテーブル情報さえあればいいので、db/shema.rbの情報から作成して下さい。 |