7.4 ユーザー登録成功
- 新規ユーザーを実際にデータベースに保存できるようにして、ユーザー登録フォームを完成させる。
7.4.1 登録フォームの完成
ユーザー登録に成功した場合はページを描画せずに別のページにリダイレクト(Redirect)するように作成する。
(前略)
def create
@user = User.new(user_params)
if @user.save
#redirect_to user_url(@user)と同じ
redirect_to @user
else
render 'new'
end
end
(後略)
演習 1
有効な情報を送信し、ユーザーが実際に作成されたことを、Railsコンソールを使って確認してみましょう。
確認のみなので省略。
演習 2
リスト 7.26を更新し、redirect_to user_url(@user)とredirect_to @userが同じ結果になることを確認してみましょう。
確認のみなので省略
7.4.2 flash
flashの実装
- 登録完了後に表示されるページにメッセージを表示(新規ユーザーへのウェルカムメッセージ)
- 2度目以降にはそのページにメッセージを表示しないようにする
flash[:success] = "Welcome to the Sample App!"
上のコードは、最終的には次のようなHTMLになる。
<div class="alert alert-success">Welcome to the Sample App!</div>
演習 1
コンソールに移り、文字列内の式展開(4.2.1)でシンボルを呼び出してみましょう。例えば"#{:success}"といったコードを実行すると、どんな値が返ってきますか? 確認してみてください。
>> "#{:success}"
=> "success"
演習 2
先ほどの演習で試した結果を参考に、リスト 7.28のflashはどのような結果になるか考えてみてください。
$ rails console
>> flash = { success: "It worked!", danger: "It failed." }
=> {:success=>"It worked!", danger: "It failed."}
>> flash.each do |key, value|
?> puts "#{key}"
?> puts "#{value}"
>> end
success
It worked!
danger
It failed.
>> "#{flash [:success]}"
=> "It worked!"
7.4.3 実際のユーザー登録
演習 1
Railsコンソールを使って、新しいユーザーが本当に作成されたのかもう一度チェックしてみましょう。結果は、リスト 7.30のようになるはずです。
>> User.find_by(email: "example@railstutorial.org")
(3.1ms) SELECT sqlite_version(*)
User Load (2.5ms) SELECT "users".* FROM "users" WHERE "users"."email" = ? LIMIT ? [["email", "example@railstutorial.org"], ["LIMIT", 1]]
=> #<User id: 1, name: "Rails Tutorial", email: "example@railstutorial.org", created_at: "2021-02-13 18:10:29", updated_at: "2021-02-13 18:10:29", password_digest: [FILTERED]>
演習 2
自分のメールアドレスでユーザー登録を試してみましょう。既にGravatarに登録している場合、適切な画像が表示されているか確認してみてください。
確認だけなので省略。
7.4.4 成功時のテスト
- データベースの中身が正しいかどうか検証する(有効な情報を送信して、ユーザーが作成されたことを確認する)
# signupの情報が有効かテストせよ
test "valid signup information" do
# signup_pathにgetリクエスト
get signup_path
#
assert_difference 'User.count', 1 do
post users_path, params: { user: { name: "Example User", email: "user@example.com", password: "password", password_confirmation: "password" } } # User情報を渡す
end
follow_redirect!
assert_template 'users/show'
end
end
演習 1
7.4.2で実装したflashに対するテストを書いてみてください。どのくらい細かくテストするかはお任せします。リスト 7.32に最小限のテンプレートを用意しておいたので、参考にしてください(FILL_INの部分を適切なコードに置き換えると完成します)。ちなみに、テキストに対するテストは壊れやすいです。文量の少ないflashのキーであっても、それは同じです。筆者の場合、flashが空でないかをテストするだけの場合が多いです。
assert_not flash.empty?
演習 2
本文中でも指摘しましたが、flash用のHTML(リスト 7.29)は読みにくいです。より読みやすくしたリスト 7.33のコードに変更してみましょう。変更が終わったらテストスイートを実行し、正常に動作することを確認してください。なお、このコードでは、Railsのcontent_tagというヘルパーを使っています。
確認のみなので省略。
演習 3
リスト 7.26のリダイレクトの行をコメントアウトすると、テストが失敗することを確認してみましょう。
ERROR["test_valid_signup_information", #<Minitest::Reporters::Suite:0x000055860cc7db60 @name="UsersSignupTest">, 7.415014998001425]
test_valid_signup_information#UsersSignupTest (7.42s)
RuntimeError: RuntimeError: not a redirect! 204 No Content
test/integration/users_signup_test.rb:20:in `block in <class:UsersSignupTest>'
RuntimeError
プログラムの実行時(プログラムを動かしているとき)に発生するエラー。
リダイレクトが無いと言われている。
演習 4
リスト 7.26で、@user.saveの部分をfalseに置き換えたとしましょう(バグを埋め込んでしまったと仮定してください)。このとき、assert_differenceのテストではどのようにしてこのバグを検知するでしょうか? テストコードを追って考えてみてください。
FAIL["test_valid_signup_information", #<Minitest::Reporters::Suite:0x00007f0389d137b8 @name="UsersSignupTest">, 8.838942277001479]
test_valid_signup_information#UsersSignupTest (8.84s)
"User.count" didn't change by 1.
Expected: 1
Actual: 0
test/integration/users_signup_test.rb:17:in `block in <class:UsersSignupTest>'
(翻訳)
test_valid_signup_information
でエラーが起こっています。
User.count
は1つも変化しませんでした。
期待値「1」
実 績「0」
assert_difference
は実行前後でUser.count
が+1になっていないといけない。
@user.save
がでいない=user
が+1されない=エラー
7.5 プロのデプロイ
7.5.4 本番環境へのデプロイ
演習 1
ブラウザから本番環境(Heroku)にアクセスし、SSLの鍵マークがかかっているか、URLがhttpsになっているかどうかを確認してみましょう。
確認のみなので省略。
演習 2
本番環境でユーザーを作成してみましょう。Gravatarの画像は正しく表示されているでしょうか?
確認のみなので省略。
さいごに
ながい、ながいぞ。
第8章では認証システム、第9章ではユーザーのログイン・ログアウトを実装するということで、いよいよ動的ページという感じがしてきました。
どれもWebアプリ作成のときは必須項目だと思うので、はりきって