###TDDで編集を成功させる
今度は編集フォームが動作するようにしましょう。
flashメッセージが空でないかどうかと、
プロフィールページにリダイレクトされるかどうかをチェックします。
ユーザー名やメールアドレスを編集するときに毎回パスワードを入力するのは不便なので、(パスワードを変更する必要が無いときは)パスワードを入力せずに更新できると便利です。
####編集の成功に対するテスト
test/integration/users_edit_test.rb
require 'test_helper'
# test_helper.rbのパラメータ群を指定
class UsersEditTest < ActionDispatch::IntegrationTest
def setup
@user = users(:michael)
end
.
.
.
test "successful edit" do
get edit_user_path(@user)
assert_template 'users/edit'
name = "Foo Bar"
email = "foo@bar.com"
patch user_path(@user), params: { user: { name: name,
email: email,
password: "",
password_confirmation: "" } }
assert_not flash.empty?
# flashメッセージが空でないかどうか
assert_redirected_to @user
# プロフィールページにリダイレクトされるかどうか
@user.reload
# データベースから最新のユーザー情報を読み込み直して、
# 正しく更新されたかどうかを確認
assert_equal name, @user.name
assert_equal email, @user.email
# データベース内のユーザー情報が正しく変更されたか
# どうかも検証します
# 更新するときはパスワードを要求しない
end
end
###ユーザーのupdateアクション
app/controllers/users_controller.rb
class UsersController < ApplicationController
.
.
.
def create
@user = User.new(user_params)
# 外部メソッドを使う
if @user.save
# 保存の成功をここで扱う。
log_in @user
# 登録後に自動ログインするため
flash[:success] = "Welcome to the Sample App!"
# 成功時一度だけ表示されるメッセージ
redirect_to @user
# urlを指定して表示する
# 保存成功したらurlを表示する
else
render 'new'
# 保存に成功しなければnewアクションに移動する
# 失敗したらまた戻る
end
end
def edit
@user = User.find(params[:id])
# データベースから探す
end
def update
@user = User.find(params[:id])
if @user.update(user_params)
# 更新に成功した場合を扱う。
flash[:success] = "Profile updated"
# 成功時にメッセージを表示
redirect_to @user
# ユーザーページを表示させる
else
render 'edit'
end
end
.
.
.
end
#####テスト
ubuntu:~/environment/sample_app (updating-users) $ rails t
Running via Spring preloader in process 16575
Started with run options --seed 34349
31/31: [============================] 100% Time: 00:00:01, Time: 00:00:01
Finished in 1.66895s
31 tests, 77 assertions, 0 failures, 0 errors, 0 skips
####演習
1.
実際に編集が成功するかどうか、有効な情報を送信して確かめてみましょう。
確認
もしGravatarと紐付いていない適当なメールアドレス(foobar@example.comなど)に変更した場合、プロフィール画像はどのように表示されるでしょうか? 実際に編集フォームからメールアドレスを変更して、確認してみましょう。
gravatarをしていない。
多分 違うアイコンを表示されると思う。