4. scaffoldを利用した開発(2)
Quick Start 4章 scaffoldを利用した開発
4.1 scaffold概要
4.2 scaffoldジェネレータの実行
4.3 テーブルの作成
4.4 アプリケーションへのアクセス
4.5 モデル(Active Record)
4.6 コントローラ(Action Controller)
4.7 ビュー(Action View)
4.8 ルーティング
4.5 モデル(Active Record)
では、scaffoldで作成されたコードを見ていきましょう。詳細は各コンポーネント説明の章で記述しますので、ここでは、一覧画面の呼び出す際にどのような流れでコードが呼び出されているか確認していきます。
まずはモデルです。app\modelsフォルダには、「item.rb」というファイルが作成されています。これがモデルにあたる、ActiveRecord::Baseを継承したクラスです。
class Item < ActiveRecord::Base end
ActiveRecord::Baseには、CRUDに必要なメソッドが用意されています。
次のコントローラのコードでは、ActiveRecord::Baseで定義しているメソッドを利用しています。
4.6 コントローラ(Action Controller)
次に、app\controllers\items_controller.rbを見ていきましょう。
ItemsControllerクラスは、ApplicationControllerクラスを継承します。リクエストに応じて定義されているメソッドが呼び出されます。この呼び出されるメソッドのことを「アクションメソッド」といいます。
定義されているアクションメソッドは以下の通りになります。
- index(一覧画面を表示)
- show(詳細画面を表示)
- new(新規登録画面を表示)
- edit(編集画面を表示)
- create(新規登録処理をし、詳細画面を表示)
- update(更新処理をし、詳細画面を表示)
- destroy(削除処理をし、一覧画面を表示)
ここでは、「http://localhost:3000/items」で呼び出される、indexメソッドを見ていきます。
class ItemsController < ApplicationController # GET /items # GET /items.xml def index @items = Item.all respond_to do |format| format.html # index.html.erb format.xml { render :xml => @items } end end # ・・・ 省略 ・・・ end
このアクションメソッドでは、Itemクラスのallメソッドを利用して、itemsテーブルのデータをすべて読み込みます。それを、@itemsというインスタンス変数に代入します。
次のrespond_toは、指定されたフォーマットに応じてどのビューのファイルを呼びだすかを決定します。
URLの最後に拡張子がつかない形で呼び出した場合、HTML形式のフォーマットで出力されます。コメントにも書いていますが、規約によりアクションメソッド名と同じ、「index.html.erb」というファイルが呼び出されます。
4.7 ビュー(Action View)
最後に、ビューです。
Railsでは、ビューのファイルのことを「テンプレート」といいます。テンプレートのフォーマットは複数ありますが、scaffoldではデフォルトで「ERB(Embedded Ruby)テンプレート」を利用します。
ERBとは、テキスト中にRubyのコードを埋め込み、動的に出力させるテンプレートです。今回はHTMLとして出力するので、HTMLベースとなっています。
ここでは、先ほど登場した、app\views\items\index.html.erbの中身を見てみましょう。
<h1>Listing items</h1> <table> <tr> <th>Name</th> <th>Price</th> <th>Description</th> <th></th> <th></th> <th></th> </tr> <% @items.each do |item| %> <tr> <td> <%= item.name %> </td> <td> <%= item.price %></td> <td> <%= item.description %></td> <td> <%= link_to 'Show', item %></td> <td> <%= link_to 'Edit', edit_item_path(item) %></td> <td> <%= link_to 'Destroy', item, :confirm => 'Are you sure?',:method => :delete %></td> </tr> <% end %> </table> <br /> <%= link_to 'New Item', new_item_path %>
Rubyのコードは、<% ~ %>や<%= ~ %>で囲って埋め込みます。<% ~ %>は、タグの中のRubyプログラムを実行しますが、出力は行いません。<%= ~ %>は、実行結果をテキストとして出力します。
また、「link_to」はビューヘルパーと呼ばれるメソッドです。その名の通り、ビュー(ERB)の助けとなるメソッドで、簡潔にコードを書くことができます。link_toはハイパーリンクを生成するビューヘルパーです。
これ以外にも多くのビューヘルパーがあります。詳しくは後の章でご紹介します。
4.8 ルーティング
一覧画面を呼びだした際のURLは「 http://localhost:3000/items 」でしたが、「index」というアクションメソッドが呼び出されたことに、疑問を持った方もいらっしゃるでしょう。
Railsでは、どのURLでどのアクションメソッドを呼び出すかは、「ルーティング」というもので定義されています。
現在のルーティングがどのようになっているかは、「rake routes」というコマンドで確認することができます。
c:\sample\scaffoldTest>rake routes (in c:/sample/scaffoldTest) items GET /items(.:format) {:action=>"index", :controller=>"items"} POST /items(.:format) {:action=>"create", :controller=>"items"} new_item GET /items/new(.:format) {:action=>"new", :controller=>"items"} edit_item GET /items/:id/edit(.:format) {:action=>"edit", :controller=>"items"} item GET /items/:id(.:format) {:action=>"show", :controller=>"items"} PUT /items/:id(.:format) {:action=>"update", :controller=>"items"} DELETE /items/:id(.:format) {:action=>"destroy", :controller=>"items"}
左から、ルート名、HTTPメソッド、URLパターン、アクションメソッドとコントローラが表示されます。
URLパターンの「:名前」は変数で、()内は任意の指定項目です。(.:format)であれば「.xml」などを指定することを指します。
1行目であれば、クライアントから、GETメソッドで「/items」というURLでアクセスした際は、itemsコントローラのindexアクションを呼びだす、というルーティングになっていることがわかります。
なぜ、このようなルーティングが設定されたのかというと、scaffoldを実行した際、ルーティングの設定を記載している config\route.rb に、「resources:items」という一文が追加されたためです。
この一文だけ、第1章で説明したRESTfulなURLを実現するルーティングを設定することができます。1
ScaffoldTest::Application.routes.draw do resources :items ・・・中略・・・ end
scaffoldは実務としては利用する機会が少ないかもしれませんが、RailsでのデータベースへのCRUDの流れを知るためには有益です。後の章で各コンポーネントの勉強をした後に、再度scaffoldで生成されたプログラムを確認すると、よりわかりやすいでしょう。
1 現在のブラウザでは、HTTPメソッドのうち、GETとPOST以外のメソッドは送信できません。そのため、PUTやDELETEについては実際はPOST で送信し、パラメータでputやdeleteと渡すことで、疑似的にRESTfulを実現しています。