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のビューテンプレートですが、当初の要件では「ひとこと」の横に「削除!」「気に入った」リンクを付与することになっていました。そこで、これらのリンクを含める形で、以下のようにビューテンプレートを実装していきます。
<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アクションメソッドで使用されるビューも作成していきます。今回は、ビューを以下のように作成します。
<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クラスの実装に入っていきましょう。
2/4 |
Index | |
Controllerクラスの実装と機能テスト(後編) | |
Page1 HitokotosControllerの本番コード実装 |
|
Page2 HitokotosControllerが使用するビューの実装 |
|
Page3 FavoritesControllerのアクションメソッド名の決定 FavoritesController機能テストを書き起こす FavoritesControllerの本番コード実装 |
|
Page4 newメソッドに対応するビューファイルの準備 FavoritesController機能テスト実行確認 FavoritesControllerが使用するビューの実装 |
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) 優れたプログラマはコードを書くのと同じくらい、読みこなす。優れたコードを読むことで自身のスキルも上達するのだ |
|
- プログラムの実行はどのようにして行われるのか、Linuxカーネルのコードから探る (2017/7/20)
C言語の「Hello World!」プログラムで使われる、「printf()」「main()」関数の中身を、デバッガによる解析と逆アセンブル、ソースコード読解などのさまざまな側面から探る連載。最終回は、Linuxカーネルの中では、プログラムの起動時にはどのような処理が行われているのかを探る - エンジニアならC言語プログラムの終わりに呼び出されるexit()の中身分かってますよね? (2017/7/13)
C言語の「Hello World!」プログラムで使われる、「printf()」「main()」関数の中身を、デバッガによる解析と逆アセンブル、ソースコード読解などのさまざまな側面から探る連載。今回は、プログラムの終わりに呼び出されるexit()の中身を探る - VBAにおけるFileDialog操作の基本&ドライブの空き容量、ファイルのサイズやタイムスタンプの取得方法 (2017/7/10)
指定したドライブの空き容量、ファイルのタイムスタンプや属性を取得する方法、FileDialog/エクスプローラー操作の基本を紹介します - さらば残業! 面倒くさいエクセル業務を楽にする「Excel VBA」とは (2017/7/6)
日頃発生する“面倒くさい業務”。簡単なプログラミングで効率化できる可能性がある。本稿では、業務で使うことが多い「Microsoft Excel」で使えるVBAを紹介する。※ショートカットキー、アクセスキーの解説あり
|
|