3rdRailによるRailsプログラミング入門

第7回 Controllerクラスの実装と機能テスト(後編)

富田 陽介
Banana Systems株式会社

2009/8/21

HitokotosControllerが使用するビューの実装

 Railsアプリケーションでは、Controllerの各アクション実行後に、標準でHTML形式のビューを作成します。ここでは、アクションメソッド実行後に作成されるビューの作成方法について紹介していきます。

 ビューの実装では、ひな形となるHTMLテンプレートを作成します。ビューについては、第1回でも触れましたが、基本的に1アクションメソッドに対し1つ用意しておく必要があります。

 ただし、アクションメソッド実行後に、ほかのアクションへのリダイレクトを行う場合は、そのアクション用のテンプレートは必要ありません。

 今回は、HitokotosControllerでindex、new、create、destroyの4つのメソッドを実装していますが、create、destroyについては、処理実行後にリダイレクトを行っていますので、indexとnewアクションメソッドに対応するビューを作成していくこととします。

 さて、HitokotosControllerが使用するビューのテンプレートについても、スカフォルド機能により作成済みです。改めて参考にしながら、必要な部分を実装していきましょう。

 [Railsエクスプローラー]−tsubuyakiプロジェクト−[コントローラー]−Hitokotosを展開し、さらに[ビュー]を展開すると、作成済みのビューが一覧できます。ここでは、edit、index、new、showの各ビューが作成済みであることが分かります。

 では、index、newのテンプレートを編集していきます。edit、showのテンプレートは使用しないので、右クリックし[削除]を選んで削除しておきます。

 まず、indexのビューテンプレートですが、当初の要件では「ひとこと」の横に「削除!」「気に入った」リンクを付与することになっていました。そこで、これらのリンクを含める形で、以下のようにビューテンプレートを実装していきます。

●index.html.erb
<h1>ひとこと一覧</h1>

<%= link_to 'つぶやく', new_hitokoto_path %>

<table>
<% for hitokoto in @hitokotos %>
  <tr>
    <td><%=h hitokoto.user.name if hitokoto.user %></td>
    <td>「<%=h hitokoto.hitokoto %>」</td>
    <td><%= link_to '気に入った', :controller => :favorites, :action => :new, :hitokoto_id => hitokoto.id %></td>
    <td><%= link_to '削除!', hitokoto, :confirm => '本当に削除しますか?', :method => :delete %></td>
  </tr>
<% end %>
</table>

 ここでは、スカフォルドにより作成されていたテンプレートを編集する形でテンプレートを作成しました。

 @hitokotosというインスタンス変数には、Controllerクラスのindexアクションメソッドが実行された際に作成されたインスタンス変数@hitokotosと同じものが入るようになっています。

 ビューの作成では、このように、Controller処理で作成した変数や、そのほかのビュー処理の結果をテンプレート内に埋め込んでいきながら、HTMLを完成させていきます。

 いくつか、ビューに特徴的な記述方法についても紹介しておきます。

 まず、<%=h hitokoto.user.name if hitokoto.user %>という書き方ですが、ここでは、hitokoto変数の値(ActiveRecordオブジェクト)から、その「ひとこと」の所有ユーザー(user)の名前(name)を取得し、HTMLエスケープした形でHTMLに埋め込んでいます(第1回での動作確認の際、userを持っていないHitokotoを作成している可能性があるので、ここではif hitokoto.userの条件式を追加しています)。

 hitokoto.userとして所有ユーザーのオブジェクトが取得できるのは、Modelクラス実装でHitokotoクラスを実装する際に、Hitokoto belongs to Userの実装をしておいたからです。このように、関連が張られたオブジェクトにスムーズにアクセスできるのは、ActiveRecordのおかげでもあります。

 また、<%=hのようにhという1文字のメソッドを使うことで、引数として渡した文字列をHTMLエスケープして埋め込むことができます。Railsアプリケーションのビュー作成時には多用されるメソッドですので確認しておきましょう。

 次に、<%= link_to '気に入った', :controller => :favorites, :action => :new, :hitokoto_id => hitokoto.id %>という書き方ですが、これはlink_toメソッドにより適当なリンク要素(標準的にはaタグを使用したもの)を出力するものです。1つめの引数でリンク文字列を指定し、2つめ以降の引数でリンク先のURLやクエリストリングに渡すパラメータを指定しています。

 今回は、上記のように書くことで「FavoritesController#newアクションメソッドを、hitokoto_id=<hitokoto.id>というクエリストリングを伴って呼び出す」というリンクを出力しようとしています。

 FavoritesControllerのアクションメソッド名は、この後改めて検討するところですが、ここで「newというアクションメソッドで新規作成画面を要求する」という決定をしたことは覚えておきましょう。

 同様に、newアクションメソッドで使用されるビューも作成していきます。今回は、ビューを以下のように作成します。

●new.html.erb
<h1>つぶやく</h1>

<% form_for(@hitokoto) do |f| %>
  <%= f.error_messages %>

  <p>
    ユーザー:<%= collection_select(:hitokoto, :user_id, @users, :id, :name) %>
  </p>
  <p>
    ひとこと:<%= f.text_field :hitokoto %>
  </p>
  <p>
    <%= f.submit "つぶやく!" %>
  </p>
<% end %>

<%= link_to 'ひとこと一覧に戻る', hitokotos_path %>

 こちらのテンプレートでは、特徴的な記述としてform_forが登場しています。これは、引数として渡されたActiveRecordオブジェクトを作成/編集するためのフォームを生成することを表しています。

 また、collection_selectというメソッドを使用して、作成する「ひとこと」の所有ユーザーをセレクトボックスで選択できるようにしています。

 form_forやcollection_selectのようにビューテンプレートの中で汎用的なHTMLコード片を出力するために使用できるメソッドをヘルパーメソッドと呼びます。Railsには、ここに登場する以外にも相当な数のヘルパーメソッドが用意されています。

 HTMLを書くことに習熟している方にとっては、用意されたヘルパーメソッドの使用方法を覚えることはあまり意味がないと思われるかもしれません。ですが、標準のヘルパーメソッドを使用していくことで、Railsが提供するほかの便利機能との連携がスムーズになるというメリットも受けられます。

 本稿では、これ以上のヘルパーメソッドの紹介はしませんので、ヘルパーメソッドの活用に興味のある方は、マニュアルや書籍などを参考にしてください。

 以上、HitokotosControllerクラスの実装と、これが利用するビューの実装を進めてきました。これで、HitokotosController開発のイテレーションは完了です。続いて、FavoritesControllerクラスの実装に入っていきましょう。

prev
2/4
next

Index
Controllerクラスの実装と機能テスト(後編)
  Page1
HitokotosControllerの本番コード実装
Page2
HitokotosControllerが使用するビューの実装
  Page3
FavoritesControllerのアクションメソッド名の決定
FavoritesController機能テストを書き起こす
FavoritesControllerの本番コード実装
  Page4
newメソッドに対応するビューファイルの準備
FavoritesController機能テスト実行確認
FavoritesControllerが使用するビューの実装

index 3rdRailによるRailsプログラミング入門

 Ruby/Rails関連記事
プログラミングは人生だ
まつもと ゆきひろのコーディング天国
 ときにプログラミングはスポーツであり、ときにプログラミングは創造である。楽しいプログラミングは人生をより実りあるものにしてくれる
生産性を向上させるRuby向け統合開発環境カタログ
Ruby on Rails 2.0も強力サポート
 生産性が高いと評判のプログラミング言語「Ruby」。統合開発環境を整えることで、さらに効率的なプログラミングが可能になる
かんたんAjax開発をするためのRailsの基礎知識
Ruby on RailsのRJSでかんたんAjax開発(前編)
 実はAjaxアプリケーション開発はあなたが思うよりも簡単です。まずはRuby on Railsの基礎知識から学びましょう
Praggerとnetpbmで作る画像→AA変換ツール
Rubyを使って何か面白いものを作ってみよう!
 一般的な画像をアスキーアートに変換するツールを作ってみる。さらに出力にバリエーションを持たせてみよう
コードリーディングを始めよう
Railsコードリーディング〜scaffoldのその先へ〜(1)
 優れたプログラマはコードを書くのと同じくらい、読みこなす。優れたコードを読むことで自身のスキルも上達するのだ
  Coding Edgeフォーラムフィード  2.01.00.91


Coding Edge フォーラム 新着記事
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

>

Coding Edge 記事ランキング

本日 月間