目次へ

4. scaffoldを利用した開発(2)

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を実現しています。

↑このページの先頭へ

こちらもチェック!

PR
  • XMLDB.jp