2011年8月24日水曜日

Rails3を初歩から学ぶ #9 createアクションをつくろう

前回createアクションの検査までつくったのでコントローラを実装しましょう。

def create
@user = User.new(params[:user])
if @user.save
flash[:success] = "登録に成功しました"
redirect_to @user
else
@title = "新規登録"
@user.password = ""
@user.password_confirmation =""
render 'new'
end
end
User.newでインスタンスを生成した段階ではDBには保存していません。
保存するにはインスタンスからsaveメソッドを呼びます。戻り値がtrueなら成功、falseなら失敗なので戻り値に応じて画面を遷移します。
redirect_toとrenderの違いですが、renderは単に指定されたテンプレートで描画するのみです。この例でいえば登録失敗時に「new.html.erb」を再表示します。
一方のredirect_toはリダイレクト先のURLをクライアントに返して、クライアントからそのURLにアクセスさせます。つまりもう一度アクションが呼ばれることになります。

ここではリダイレクト先としてインスタンス変数を渡していますが、Userモデルのインスタンス変数を渡すと、ActiveControllerは「user_path/@user.id」として解釈してくれます。例えば登録した@userのidが1であればリダイレクト先として「user_path/1」がクライアントに渡り、クライアントはそのアドレスに向けてGETします。
すると今度はshowアクションが呼ばれるわけです。
というわけで、createアクション向けには対応するviewのテンプレートを用意する必要はありません(今回の例では、です)。

が、このままではせっかく設定したflashが表示されないので表示させてやりましょう。flashの表示はshowアクションに限ったことではないのでアプリケーション共通で使用する「view/layout/application.html.erb」に追加します。

<body>
<% flash.each do |key, value| %>
<%= content_tag(:div, value, :class => "flash #{key}") %>

<% end %>
<%= yield %>
</body>
ここでは単純にflashに設定された全てのキーと値を表示するようにしています。
「content_tag」ヘルパは何となく何するか分かると思いますが、指定されたタグを指定された値で指定された属性を付加して生成するものです。
この結果
<div class="flash success">登録に成功しました<div>
といったタグが生成されます。
ここまで出来たらRSpecを実行して検査をパスすることを確認してください。
また「rails server」としてサーバを起動して、「http://localhost:3000/users/new」にアクセスして必要な情報を入力して登録してみましょう。

次回からは認証プロセスをつくっていってみましょう。

0 件のコメント:

コメントを投稿