0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

【Railsチュートリアル】第7章 ユーザー登録④

Posted at

7.4 ユーザー登録成功

  • 新規ユーザーを実際にデータベースに保存できるようにして、ユーザー登録フォームを完成させる。

7.4.1 登録フォームの完成

ユーザー登録に成功した場合はページを描画せずに別のページにリダイレクト(Redirect)するように作成する。

user_controller.rb
(前略)
  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はどのような結果になるか考えてみてください。

リスト7.28
$ 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 成功時のテスト

  • データベースの中身が正しいかどうか検証する(有効な情報を送信して、ユーザーが作成されたことを確認する)
test/integration/users_signup_test.rb

# 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アプリ作成のときは必須項目だと思うので、はりきって

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?