プロジェクト

全般

プロフィール

GuideConclusion » 履歴 » バージョン 1

Mitsuyoshi Yoshida, 2011/06/25 23:43

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