2011年8月13日土曜日

Rails3を初歩から学ぶ #6 コントローラをつくろう

前回作成したコントローラ向けのテストをパスできるようにnewアクションを実装します。
app/controller/users_controller.rb を開いて以下のように編集します。

class UsersController < ApplicationController
  def new
    @user = User.new
    @title = "新規登録"
  end
end
@のついたインスタンス変数をViewで参照します。
ここでは空で生成したUserオブジェクトと 、タイトルを変数に格納しています。
次に対応したviewを編集するのですが、Railsでは「app/views/コントローラ名/アクション名.html.erb」が該当するviewとなります。
今回の例では「app/views/users/new.html.erb」がnewアクションに対応したviewとなります。
<%= form_for(@user) do |f| %>
    <%= f.label :name, "ユーザー名" %>
    <%= f.text_field :name %>
    <%= f.label :password, "パスワード" %>
    <%= f.password_field :password %>
    <%= f.label :password_confirmation, "パスワード(確認)" %>
    <%=f.password_field :password_confirmation %>
    <%=f.submit "新規登録" %>
<% end %>
form_forに渡している「@user」がコントローラで生成した@userです。
form_forからendまでのブロック内はそのuserオブジェクトのフィールドに対応づけられます。「 f.text_field :name」なんていう指定だけで、うまいこと設定されるのはこのようにRailsが対応付けしてくれているからなんですね。

ここでは一つ一つのdivにクラス指定していますが、CSS用です。
今回はデザイン面は放置するので使いませんが。
ここまででほぼテストは通りますが、まだタイトルがNGです。
タイトルを定義しましょう。
ここではWebアプリ全体で「FavMovie | XXXX」というタイトルを表示するものとします。「XXXX」の部分には「新規登録」「ユーザー情報編集」などアクションに応じたタイトルを設定します。

アクション共通で使用されるテンプレートは app/views/layout/application.html.erb です。この中に「<%= yield %>」となっている箇所がありますが、ここにアクションごとの個別のテンプレートが挿入されます。先ほどの例でいえば「new.html.erb」の内容がここに挿入されます。
titleは上のheader要素内にありますが、今回は動的にタイトルを変更したいので、ここでそのようなコードを入れると可読性が損なわれます。そこでヘルパメソッドとして定義しましょう。
app/helpers/application_helper.rb を開きます。

module ApplicationHelper
  def title
    base_title = "FavMovie"
    if @title.nil?
      base_title
    else
      #{base_title} | #{@title}
    end
  end
end

ここで見ている@titleがコントローラで設定されるものです。セットされていない場合は「FavMovie」とだけ表示します。
そして application.html.erb で呼び出してみましょう。
<title><%= title %></title>
これでテストは全てパスするようになります。
コンソールから「rails server」としてサーバを立ち上げて「http://localhost:3000/users/new」にアクセスしてみましょう。
3つのテキストボックスと1つのサブミットボタンがあることが確認できます。
ここでソースを確認してみるとform要素は以下のようになっています。
<form accept-charset="UTF-8" action="/users" class="new_user" id="new_user" method="post">
ここから「users」コントローラに対して「POST」で要求されることが読み取れます。
前回実行した「rake routes」の結果を再確認してみましょう。
POST   /users(.:format)          {:action=>"create", :controller=>"users"}
「/users」に対して「POST」要求がされた場合、usersコントローラのcreateアクションに処理が渡ることが示されています。
というわけで、お次はcreateアクションの実装、といきたいところですが、その前にshowアクションを実装することにします。ルート定義はこちら。


user GET    /users/:id(.:format)      {:action=>"show", :controller=>"users"}


「/users/1」などというパスでGETが要求されるとshowアクションが呼ばれます。
「:id」に当たる部分はUserテーブルのid(主キー)に該当します。
つまりリソース(ここではUserモデル)の1レコードに対する情報を表示するページとなります。
今回のUsersモデルの例でいえば各ユーザーの個人ページに当たるでしょう。
次回はこちらを作成してみることにします。



0 件のコメント:

コメントを投稿