ビューの動作
ビューとは?
-
Rubyコードが埋め込まれたhtmlファイルのテンプレート
-
<% ~~ %> で、くくった部分がRubyとして実行される。PHPと同じ
-
それ以外の部分はそのままHTMLとして出力
ファイル表記ルール
-
app/views/コントローラ名/アクション名.rhtml
-
memoアプリでは、app/views/memo/list.rhtmlがコールされ、その中のRubyコードが実行される。
コントローラーのビュー処理
app/views/memo/list.rhtml
01 <h1>メモ帳一覧</h1>
02
03 <table BORDER="1" CELLSPACING="0" CELLPADDING="2" WIDTH="90%">
04 <tr>
05 <% for column in Memo.content_columns %>
06 <th><%= column.human_name %></th>
07 <% end %>
08 </tr>
09
10 <% for memo in @memos %>
11 <tr>
12 <% for column in Memo.content_columns %>
13 <td><%=h memo.send(column.name) %></td>
14 <% end %>
15 <td><%= link_to 'Show', :action => 'show', :id => memo %></td>
16 <td><%= link_to 'Edit', :action => 'edit', :id => memo %></td>
17 <td><%= link_to 'Destroy', { :action => 'destroy', :id => memo }, :confirm => 'Are you sure?', :method => :post %></td>
18 </tr>
19 <% end %>
20 </table>
21
22 <%= link_to 'Previous page', { :page => @memo_pages.current.previous } if @memo_pages.current.previous %>
23 <%= link_to 'Next page', { :page => @memo_pages.current.next } if @memo_pages.current.next %>
24
25 <br />
26
27 <%= link_to 'New memo', :action => 'new' %>
-
[5]-[7]:TitleやBodyなどの文字列は、ビューがモデルから動的に取得した。
<th><%= column.human_name %></th>
-
[6] columnで指定されたカラムの名称で、[5]-[7]でMemoモデルの各カラム名を、<th>~</th>のテーブル要素にしている。
-
[10]-[19]が、モデル・データの表示部
<% for memo in @memos %>
-
@memosに、コントローラのpaginateで取得した10件のデータが配列として入る。
-
[12]-[14]カラム毎の処理。モデルのカラム名を、取得したMemoオブジェクトへ送信(send)することで、そのカラムデータを取り出している。
-
[15]-[17]で、レコードの詳細表示、編集、削除へのリンク
-
ビューでは、コントローラとアクション名を指定すると、リンクを生成してくれるlink_to関数が使える。
-
[10]の<% for memo in @memos %>で、インデックスの数字が入るので、ページ上で、「Show」クリックは、memo/show/1のURLジャンプとなる。
-
link_to関数が生成するURLは、config/routes.rbで設定されたルールが反映されている。
-
config/routes.rbのルールは、URLからコントローラとアクションを取り出すだけでなく、コントローラーとアクション名からURLを取り出すことにも使われる。
-
コントローラーとアクション名に対応するURLを生成して、HTMLファイルの<A>タグに記述する。
-
Destroyでは、DBからデータを削除する。
<%= link_to 'Destroy', { :action => 'destroy', :id => memo },
:confirm => 'Are you sure?',
:method => :post %></td>
-
Destroyアクションを実行するだけでなく。
-
JavaScriptの確認用のボックス「Are you sure?」を、:confirmオプションで指定
-
:methodでHTTPメソッドを指定
-
[22]-[23] ページの送りと戻り
<%= link_to 'Previous page',
{ :page => @memo_pages.current.previous }
if @memo_pages.current.previous %>
<%= link_to 'Next page',
{ :page => @memo_pages.current.next }
if @memo_pages.current.next %>
-
「a if b」(Ruby構文): 「if b then a ; end 」と同じ
list.rhtmlの処理後
-
生成されたHTMLが、Dispatcherに戻される
-
WEBrickを通じて、クライアントにHTMLが渡る