Edited at

Ruby on Rails チュートリアル 5.0(第4版) 第11章 演習と解答まとめ

Ruby on Rails チュートリアル 5.0(第4版)を学習中です。

演習問題を自分なりに実施しました。

もし間違い等あればコメントいただけると嬉しいです。


演習11.1.1


演習11.1.1.1

<問題>

現時点でテストスイートを実行すると greenになることを確認してみましょう。

<解答>

動作確認のみなので省略。


演習11.1.1.2

<問題>

表 11.2の名前付きルートでは、_pathではなく_urlを使うように記してあります。なぜでしょうか? 考えてみましょう。ヒント: 私達はこれからメールで名前付きルートを使います。

<解答>

メールのURLからアクセスするため。


演習11.1.2


演習11.1.2.1

<問題>

本項での変更を加えた後、テストスイートが green のままになっていることを確認してみましょう。

<解答>

動作確認のみなので省略。


演習11.1.2.2

<問題>

コンソールからUserクラスのインスタンスを生成し、そのオブジェクトからcreate_activation_digestメソッドを呼び出そうとすると (Privateメソッドなので) NoMethodErrorが発生することを確認してみましょう。また、そのUserオブジェクトからダイジェストの値も確認してみましょう。

<解答>

動作確認のみなので省略。


演習11.1.2.3

<問題>

リスト 6.34で、メールアドレスの小文字化にはemail.downcase!という (代入せずに済む) メソッドがあることを知りました。このメソッドを使って、リスト 11.3のdowncase_emailメソッドを改良してみてください。また、うまく変更できれば、テストスイートは成功したままになっていることも確認してみてください。

<解答>


user.rb

class User < ApplicationRecord

attr_accessor :remember_token, :activation_token
before_save :downcase_email
(中略)

private

# メールアドレスをすべて小文字にする
def downcase_email
self.email.downcase! <---注目
end
(中略)
end


テストはGREEN。


演習11.2.1


演習11.2.1.1

<問題>

コンソールを開き、CGIモジュールのescapeメソッド (リスト 11.15) でメールアドレスの文字列をエスケープできることを確認してみましょう。このメソッドで"Don’t panic!"をエスケープすると、どんな結果になりますか?

<解答>

>> CGI.escape('Don’t panic!')

=> "Don%E2%80%99t+panic%21"


演習11.2.2


演習11.2.2.1

<問題>

Railsのプレビュー機能を使って、ブラウザから先ほどのメールを表示してみてください。「Date」の欄にはどんな内容が表示されているでしょうか?

<解答>

Dateはブラウザでメールを表示した時点の日時。


演習11.2.3


演習11.2.3.1

<問題>

この時点で、テストスイートが greenになっていることを確認してみましょう。

<解答>

動作確認のみなので省略。


演習11.2.3.2

<問題>

リスト 11.20で使ったCGI.escapeの部分を削除すると、テストが redに変わることを確認してみましょう。

<解答>

動作確認のみなので省略。


演習11.2.4


演習11.2.4.1

<問題>

新しいユーザーを登録したとき、リダイレクト先が適切なURLに変わったことを確認してみましょう。その後、Railsサーバーのログから送信メールの内容を確認してみてください。有効化トークンの値はどうなっていますか?

<解答>

https://rails-tutorial-mhartl.c9users.io/account_activations/wGEP2viu2WQbS9n36A41Lg/edit?email=2%40gmail.com


演習11.2.4.2

<問題>

コンソールを開き、データベース上にユーザーが作成されたことを確認してみましょう。また、このユーザーはデータベース上にはいますが、有効化のステータスがfalseのままになっていることを確認してください。

<解答>

動作確認のみなので省略。


演習11.3.1


演習11.3.1.1

<問題>

コンソール内で新しいユーザーを作成してみてください。新しいユーザーの記憶トークンと有効化トークンはどのような値になっているでしょうか? また、各トークンに対応するダイジェストの値はどうなっているでしょうか?

<解答>

動作確認のみなので省略。


演習11.3.1.2

<問題>

リスト 11.26で抽象化したauthenticated?メソッドを使って、先ほどの各トークン/ダイジェストの組み合わせで認証が成功することを確認してみましょう。

<解答>

動作確認のみなので省略。


演習11.3.2


演習11.3.2.1

<問題>

コンソールから、11.2.4で生成したメールに含まれているURLを調べてみてください。URL内のどこに有効化トークンが含まれているでしょうか?

<解答>

https://rails-tutorial-mhartl.c9users.io/account_activations/wGEP2viu2WQbS9n36A41Lg/edit?email=2%40gmail.com

"wGEP2viu2WQbS9n36A41Lg"が有効化トークン。


演習11.3.2.2

<問題>

先ほど見つけたURLをブラウザに貼り付けて、そのユーザーの認証に成功し、有効化できることを確認してみましょう。また、有効化ステータスがtrueになっていることをコンソールから確認してみてください。

<解答>

動作確認のみなので省略。


演習11.3.3


演習11.3.3.1

<問題>

リスト 11.35にあるactivateメソッドはupdate_attributeを2回呼び出していますが、これは各行で1回ずつデータベースへ問い合わせしていることになります。リスト 11.39に記したテンプレートを使って、update_attributeの呼び出しを1回のupdate_columns呼び出しにまとめてみましょう (これでデータベースへの問い合わせが1回で済むようになります)。また、変更後にテストを実行し、 greenになることも確認してください。

<解答>


user.rb

class User < ApplicationRecord

(中略)

# アカウントを有効にする
def activate
update_columns(activated: true, activated_at: Time.zone.now)
end

(後略)



演習11.3.3.2

<問題>

現在は、/usersのユーザーindexページを開くとすべてのユーザーが表示され、/users/:idのようにIDを指定すると個別のユーザーを表示できます。しかし考えてみれば、有効でないユーザーは表示する意味がありません。そこで、リスト 11.40のテンプレートを使って、この動作を変更してみましょう8。なお、ここで使っているActive Recordのwhereメソッドについては、13.3.3でもう少し詳しく説明します。

<解答>


users_controller.rb

class UsersController < ApplicationController

before_action :logged_in_user, only: [:index, :edit, :update, :destroy]
before_action :correct_user, only: [:edit, :update]
before_action :admin_user, only: :destroy

def index
@users = User.where(activated: true).paginate(page: params[:page])
end

def show
@user = User.find(params[:id])
redirect_to root_url and return unless @user.activated?
end

(後略)



演習11.4


演習11.4.1

<問題>

実際に本番環境でユーザー登録をしてみましょう。ユーザー登録時に入力したメールアドレスにメールは届きましたか?

<解答>

動作確認のみなので省略。


演習11.4.2

<問題>

メールを受信できたら、実際にメールをクリックしてアカウントを有効化してみましょう。また、Heroku上のログを調べてみて、有効化に関するログがどうなっているのか調べてみてください。ヒント: ターミナルからheroku logsコマンドを実行してみましょう。

<解答>

動作確認のみなので省略。

<a href="https://&lt;your heroku app&gt;.herokuapp.com/account_activations/uiXkg8zRNKlluX3pX7-vwg/edit?email=mochikichi%40live.jp">Activate</a>


関連記事

Ruby on Rails チュートリアル 完全攻略 概要と演習解答総まとめ

http://mochikichi.hatenablog.com/entry/rails_tutorial_guide