ル微王徴

ビューの動作

最終更新:

rubyocho

- view
メンバー限定 登録/ログイン

ビューの動作

ビューとは?

  • 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 」と同じ
      • 「もし b が真なら、aを実行」

list.rhtmlの処理後

  • 生成されたHTMLが、Dispatcherに戻される
  • WEBrickを通じて、クライアントにHTMLが渡る
目安箱バナー