scaffoldが作ったコードを覗いてみる。

Scaffoldが提供する機能。

ここでもう一度、scaffoldがどんな機能を提供してくれるのか整理してみた。思いつくままに言葉で表現するとこんな感じになった。(漏れがあるかもしれない...。)

  • 一覧表示
    • 1レコードを一行ずつ、リスト表示する。Show(個別表示)、Edit(編集)、Destroy(削除)のリンクあり。
    • 1ページの表示件数は10件まで。
    • 10件以上の場合は「Next page」「Previous page」を表示して、ページを切り替えて表示する。
    • 一番下にNew software(新規作成)のリンクあり。
  • 新規作成
    • 新規作成ページを表示する。
    • Createボタンを押して、正常に登録されると、一覧表示の1ページ目に移動する。
    • 一番上に緑色で「Software was successfully created.」のメッセージが表示される。
    • Backをクリックすると、一覧表示の1ページ目に移動する。
  • 編集
    • 編集ページを表示する。
    • Editボタンを押して、正常に登録されると、個別表示ページに移動する。
    • 一番上に緑色で「Software was successfully updated.」のメッセージが表示される。
    • Showをクリックすると、個別表示ページへ移動して、現在の内容を表示する。
    • Backをクリックすると、一覧表示の1ページ目に移動する。
  • 個別表示
    • 個別表示のページで、1レコードだけ表示する。
    • Editをクリックすると、編集ページへ移動して、現在の表示を編集することが出来る。
    • Backをクリックすると、一覧表示の1ページ目に移動する。
  • 削除
    • 一覧表示ページで、1件ずつ削除ができる。
    • Destroyを押すと「Are you sure?」の確認をする。
    • 「OK」を押すと、対象を削除して、一覧表示の1ページ目に移動する。
    • 「キャンセル」を押すと、何もしないで、現在のページに戻る。

Railsの気持ちになって、コードを追ってみることにした。

インデックスページの表示
webブラウザのURL
http://0.0.0.0:3000/softwares

webブラウザの表示、データが登録されていないのでタイトルしか表示されていない。

  1. http://0.0.0.0:3000/softwares/index が呼び出される。*1
  2. SoftwaresControllerのindexメソッド*2が実行される。
  3. indexメソッドでは、listメソッドを実行して、list.rhtmlで描画する。(つまり、http://0.0.0.0:3000/softwares/listが入力された時と全く同じ動作をする)
コントローラsoftwares_controller.rb
app/controllers/softwares_controller.rb
  • RailsはURLをhttp://0.0.0.0:3000/コントローラ名/メソッド名/idとして解釈する。
  • app/controllersの中から、コントローラ名/メソッド名のコードを探して実行する。
  • idは、データベースにアクセスする時のキーとして利用する。
class SoftwaresController < ApplicationController
  def index
    # listメソッドを実行。
    list
    # list.rhtmlで描画。
    render :action => 'list'
  end

  # GETs should be safe (see http://www.w3.org/2001/tag/doc/whenToUseGet.html)
  verify :method => :post, :only => [ :destroy, :create, :update ],
         :redirect_to => { :action => :list }

  def list
    # paginateで、データベースのsoftwaresテーブルから、1ページ当り10件分のデータを取り出す。
    # @software_pagesにページ情報、@softwaresに10件分のデータが入る。
    @software_pages, @softwares = paginate :softwares, :per_page => 10
  end
...(途中省略)...
end
ビュー list.rhtml
app/views/softwares/list.rhtml
  • rhtmlファイルとは、htmlの中にRubyコードを埋め込んで記述したファイルである。
  • Rubyコードを記述する時はこのように<%と%>で囲む。<% Rubyコード %>
  • 付加する記号によって、下記のような動作の違いがある。
<% %> Rubyコードの実行のみ
<%= %> Rubyコードを実行して、実行結果で置き換える(HTML解釈して出力する場合)
<%=h %> Rubyコードを実行して、実行結果で置き換える(データそのものを出力する場合)
<%# %> Rubyコードのコメント、何もしない


ページの見出し表示

<h1>Listing softwares</h1>


テーブルの始まり、列のタイトルと、10件分のデータを表形式で表示

<table>

 列のタイトルを表示、例えば、こんな表示になる
 Title Description Url

  <tr>
  <% for column in Software.content_columns %>
    <th><%= column.human_name %></th>
  <% end %>
  </tr>


 1レコードずつ、Show Edit Destroyのリンクと共に、データ行を10件分表示、例えば、こんな表示になる
 cocoaMySQL MySQLGUIで操作できる。 http://cocoamysql.sourceforge.net/ Show Edit Destroy
 @softwaresには、コントローラが設定したデータ10件が入っている。
 3-5行目で、title、description、urlのデータを描画
 6-8行目で、show、edit、destroyのリンクを描画
 上記をデータ件数分、繰り返す(1ページ当り10件まで)
 8行目で:confirm => 'Are you sure?', :post => trueとすることで、確認画面でOKの時だけ、リンク先に移動する

01 <% for software in @softwares %>
02   <tr>
03   <% for column in Software.content_columns %>
04     <td><%=h software.send(column.name) %></td>
05   <% end %>
06     <td><%= link_to 'Show', :action => 'show', :id => software %></td>
07     <td><%= link_to 'Edit', :action => 'edit', :id => software %></td>
08     <td><%= link_to 'Destroy', { :action => 'destroy', :id => software }, :confirm => 'Are you sure?', :post => true %></td>
09   </tr>
10 <% end %>

テーブルの終了

</table>


次ページや前ページがあれば、そのリンクを表示
Previous page Next page

<%= link_to 'Previous page', { :page => @software_pages.current.previous } if @software_pages.current.previous %>
<%= link_to 'Next page', { :page => @software_pages.current.next } if @software_pages.current.next %> 


改行して、新規作成へのリンクを表示
New software

<br />
<%= link_to 'New software', :action => 'new' %>

*1:softwaresの後が省略されている場合は、indexが補完される。

*2:indexメソッドとは、def indexとendで挟まれた部分