プロジェクト

全般

プロフィール

GuideConclusion » 履歴 » バージョン 3

Mitsuyoshi Yoshida, 2012/01/19 00:12

1 1 Mitsuyoshi Yoshida
h1. まとめ
2
3
プラグインの作り方のまとめです。
4
5
h2. Rails 
6
7
Rails のポイントは MVC 構造と 2 つの方針です。
8
9
h3. MVC 構造
10
11
|_. Model | データを扱う部分。クラスのインスタンスがデータベースの 1 つのレコードに対応し、テーブルからの取得にはクラスメソッドを使用する |
12
|_. View | html を作成する部分。 Erb で埋め込み式の ruby コードを評価して作成する |
13
|_. Control | ユーザのアクションに応答する部分。アクションに対応したメソッドを実行する |
14
15
16
17
h3. 設定よりも規約
18
19
名前に規則を持たせることで設定の手間を省き、簡単に作成できるようにします。
20
21
ファイルを置くディレクトリは決まっています。
22
23
24
*プラグインのディレクトリ*
25
26
<pre>
27
(Redmine のトップディレクトリ)/vender/plugins/(プラグイン名)
28
</pre>
29
30
*プラグインディレクトリ内*
31
32
<pre>
33
init.rb			最初にロードされるファイル。プラグインの定義を記述
34
app/
35
├ controllers/         コントローラ
36
├ models/              モデル
37
└ views/               ビュー
38
db/migrate/             データベース操作
39
config/locales/         国際化用メッセージファイルの格納
40
</pre>
41
42
43
ファイルは基本的に 1 ファイルに 1 クラスを記述し、ファイル名はクラス名をスネークケースに変換した名前になります。
44
45
<pre>
46
FoosController -> foos_controller.rb
47
</pre>
48
49
ビューのファイルは 1 ファイルに 1 つのアクション用ページを記述します。
50
51
<pre>
52
app/views/(コントローラ名)/(アクション名).html.erb
53
54
ex.) app/views/foos/index.html.erb
55
</pre>
56
57
58
59
h3. 繰り返しの禁止
60
61
同じことを何度も書かない。
62
63
繰り返しを避けるための機能が用意されています。
64
65
*before_filter*
66
67
コントローラで各アクションのメソッドの前に実行されるメソッドを指定します。
68
69
*部分描画*
70
71
ビューで同じ部分を別ファイルとして共通化します。
72
部分描画用のファイル名には先頭に _ を付けます。指定する場合は _ と拡張子を省き、 app/views からのパスを書きます。
73
74
<pre><code class="rhtml">
75
<%= render :partial=>"foos/form" %>
76
</code></pre>
77
78
79
*レイアウト*
80
81
全ビューで共通する部分はレイアウトファイルに書きます。 
82
レイアウトファイルは app/views/layouts 以下に置き、コントローラでレイアウトを指定します。
83
84
<pre><code class="ruby">
85
layout "standard"
86
</code></pre>
87
88
89
h2. スケルトンの生成
90
91
プラグインを作るには雛形となるスケルトンを作成して、そこに中身を追加していきます。
92
スケルトンは *プラグイン全体* 、 *コントロール* 、 *モデル* の 3 つです。 ビューはコントロールと一緒に生成されます。
93
94
プラグインの作成は Rails のトップディレクトリで実行します。
95
96
<pre>
97
$ ruby script/generate redmine_plugin プラグイン名
98
$ ruby script/generate redmine_plugin_controler プラグイン名 コントローラ名 [アクション名 ...]
99
$ ruby script/generate redmine_plugin_model プラグイン名 モデル名 [カラム名:型 ...]
100
</pre>
101
102
モデルの場合にはデータベースへのテーブル作成用のファイルも生成されます。
103
テーブルの作成には rake を使用します。
104
105
<pre>
106
$ rake db:migrate_plugins
107
</pre>
108
109
110
スケルトン生成後、次のような作業を行うことになります。
111
112
*init.rb*
113
114
* バージョンなどの各情報を設定します。
115
* プラグインのトップページを呼び出すためのメニューを追加します。
116
117
*モデル*
118
119
* データ要素が妥当なものかの判定処理を追加します。
120
121
*コントロール*
122
123
* 各アクションごとのメソッドを実装します。
124
125
*ビュー*
126
127
* 各アクションごとのページの内容を記述します。
128
129
130
131
h2. プロジェクトごとのプラグイン
132
133
プロジェクトごとにデータ管理するプラグインにするために必要なことをあげます。
134
135
* init.rb
136
** プロジェクトモジュールの登録 project_module 
137
*** 各アクションの権限の指定 permission
138
** プロジェクトメニューへの項目の追加 menu
139
* コントローラクラス
140
** @project の設定 Project.find(params[:id])
141
** ログインチェック authorize
142
** メニューを選択状態 menu_item
143
144
145
h2. 国際化
146
147
config/locals 以下に言語別のメッセージファイル(en.yml, ja.yml など)を作成します。
148
メッセージファイルには、キーとメッセージのペアを記述します。
149
150
<pre><code class="yaml">
151
言語の識別子:
152
  シンボル名: メッセージ
153
  シンボル名: メッセージ
154
          # :
155
</code></pre>
156
157
メッセージファイルの記述には注意事項があります。
158
159
* インデントで階層化される
160
* タブの使用禁止
161
* 文字コードは UTF-8
162
163
164
通常、メッセージを取得する場合には次の国際化ライブラリ(i18n)のメソッドを使用します。
165
166
<pre><code class="ruby">
167
l(:キー)
168
</code></pre>
169
170
171
しかし、以下のものは自動的にキーが検索されます。あえてラベルを変えたい場合はオプションで :label の値を指定します。
172
173
|_. 項目       |_. 検索キー   |_. 例             |
174
| メニュー項目 | label_項目名 | label_standard |
175
| モジュール名 | project_module_モジュール名 | project_module_standard |
176
| 権限項目     | permission_名前 | permission_view_foos |
177
| フォームのフィールド | field_フィールド名 |field_subject |
178
179
180
h2. データの流れ
181
182
h3. ビュー → コントロール
183
184
メニューやビューの link_to などで作ったリンクまたはフォームからコントロールのアクションが呼び出されます。
185
186 3 Mitsuyoshi Yoshida
リンクはハッシュで指定します。:control, :action などの要素でアドレス(呼び出すアクション)を指定し、後のパラメータは *params* 変数にハッシュとして格納されてコントロールに渡されます。 プロジェクトの識別名は project_id をキーとして指定します。:id パラメータは特殊でアドレスの一部としても使われます。
187 1 Mitsuyoshi Yoshida
188
<pre><code class="ruby">
189 3 Mitsuyoshi Yoshida
link_to(表示文字列, {:control=>:foos, :action=> :show, :project_id => "demo", :id => 1})
190 1 Mitsuyoshi Yoshida
</code></pre>
191
192 3 Mitsuyoshi Yoshida
アドレスは何もしないと以下のようになります。 config/routes.rb を指定して URL を変更することもできます。
193
194 1 Mitsuyoshi Yoshida
<pre>
195 3 Mitsuyoshi Yoshida
アドレス: http://127.0.0.1/foos/show/1?project_id=demo
196
params = {:project_id => "demo", :id => "1"}
197 1 Mitsuyoshi Yoshida
</pre>
198
199 3 Mitsuyoshi Yoshida
200
201 1 Mitsuyoshi Yoshida
フォームで送る場合はフォームの各フィールドのパラメータが params[:フォーム名] の子要素のハッシュで格納されて渡されます。
202
203
<pre><code class="ruby">
204
<% form_for(:foo, (モデルのオブジェクト), 
205 3 Mitsuyoshi Yoshida
            :url=>{:control=>:foos, :action=> :new, :project_id => "demo"}) do |f| %>
206 1 Mitsuyoshi Yoshida
  <p> <%= f.text_field(:subject) %>    </p>
207
  <p> <%= f.text_area(:description) %> </p>
208
      <%= f.submit l(:button_create) %>
209
<% end %>
210
</code></pre>
211
212
<pre>
213 3 Mitsuyoshi Yoshida
アドレス: http://127.0.0.1/foos/new?project_id=demo
214
params = {:project_id => "demo", :foo=>{:subject=>(入力値), :description=>(入力値) } }
215 1 Mitsuyoshi Yoshida
</pre>
216
217
218
h3. コントロール ← モデル
219
220
データベースからのデータの取得はモデルのクラスメソッドを使ってコントロール内で行います。
221
222
<pre><code class="ruby">
223
Foo.find(:all, :conditions => ["project_id = #{@project.id} "])   # project_id の一致する全要素を取得
224
Foo.find(:first, :conditions => ["id = #{foo_id} "])   # id の一致する最初の要素を取得
225
Foo.find_by_id(foo_id)                                 # 前の簡易版
226
</code></pre>
227
228
データベースに変更を加える場合には Foo のオブジェクトのメソッドを使用します。
229
230
|_. 操作 |_. 関数 |_. 説明 |
231
| 追加  | foo.save | id メンバが 0 で保存をすると新しいレコードとして追加されます。追加の際 id が連番で割り振られます。|
232
| 更新  | foo.save | id が 0 以外の場合には対象となるレコードが更新されます。 |
233
| 削除  | foo.destory | テーブルからレコードが削除されます |
234
235
236
h3. コントロール → ビュー
237
238
ビューの Erb ファイルの評価はコントロール内で行われるので、コントロールクラスのインスタンス変数(@)はビュー内でもそのまま使用できます。
239
240
241
h1. 終わりに
242
243
以上でプラグインの開発ガイドは終了です。
244
作成方法の基本はご理解いただけたでしょうか。
245
246
実際にプラグインを作ろうと思った場合、ガイドの知識だけでは不足すると思います。そういったときは [[プラグイン_Tips]] を見てください。こちらには応用的な機能の実現方法が紹介されています。
247
そこにも知りたい内容がない場合は、他のプラグインや Redmine 自身のソースを見てください。おそらくソースの中身が大分読みやすくなっているのではないでしょうか。
248
249
これから Redmine に不足を感じたら、自分でプラグインを作って満足のいく Redmine に仕上げていってください。
250
そしてプラグインができたらどんどん公開して、みんなで Redmine をいいソフトにしていきましょう。
251
252
253
---
254
255
| [[プラグイン開発ガイド|^]] | [[GuideActionElse|<<]] |