2011年9月15日木曜日

Rails3を初歩から学ぶ #20 ユーザー削除

この一連のエントリは
Ruby on Rails 3 Tutorial: Learn Rails by Example (Addison-Wesley Professional Ruby Series)
で参考に学んだことを凝縮してお送りしています。

一連のユーザーリソースに対するアクションも残すところあと1つ。
今回はユーザー削除に対応するdeleteアクションを実装します。
仕様としてはユーザー情報ページに「退会する」というリンクを設けて、クリックしたら退会するものとします。
ではテストをつくりましょう。

describe "DELETE 'destroy'" do
describe "削除失敗するケースの検証" do
before(:each) do
@user = Factory(:user)
end
it "サインインしていなければサインインページに飛ばす" do
delete :destroy, :id => @user
response.should redirect_to(new_session_path)
end
it "削除対象が異なるユーザーならルートに飛ばす" do
wrong_user = Factory(:user, :name => "Sabrou")
controller.sign_in(wrong_user)

delete :destroy, :id => @user
response.should redirect_to(root_path)
end
end #削除失敗するケースの検証
describe "削除成功の検証" do
before(:each) do
@user = Factory(:user)
controller.sign_in(@user)
end
it "ユーザー数が減っていること" do
lambda do
delete :destroy, :id => @user
end.should change(User, :count).by(-1)
end
it "削除したら新規登録ページに移動する" do
delete :destroy, :id => @user
response.should redirect_to(new_user_path)
end
end #削除成功の検証
end #DELETE 'destroy'
ちょっと長いですが、今まで数回に分けていたものを一度に書いているだけで特に目新しいものはないです。
次にコントローラを実装します。

def destroy
User.find(params[:id]).destroy
flash[:success] = "退会しました"
redirect_to new_user_path
end
この段階でテストはパスします。
ユーザー情報ページに退会用のリンクをつくりましょう。
app/views/layouts/_header.html.erbに以下の一行を追加します。
<li><%= link_to "退会する", current_user, :method => :delete, :confirm => "退会します。よろしいですか?", :title => "#{current_user.name}" %></li>
link_toメソッドのパラメータとして「:confirm」を指定して確認メッセージを表示するようにしています。
これでUserリソースに対する操作は一通り実装しました。
次回からは映画情報のモデルを(ようやく)つくります。

0 件のコメント:

コメントを投稿