12章をやります。
リスト 12.4 では、これまでやってきたように Bootstrap 4 に対応する形で class を書き直します。
<% provide(:title, "Forgot password") %> <h1>Forgot password</h1> <div class="row"> <div class="col-md-6 offset-md-3"> <%= form_for(:password_reset, url: password_resets_path) do |f| %> <%= f.label :email %> <%= f.email_field :email, class: 'form-control' %> <%= f.submit "Submit", class: "btn btn-primary" %> <% end %> </div> </div>
リスト 12.18 はちょっと難しいですね。
get 〜 や post 〜 などでアクセスして assert_xxx で確認、というのを繰り返しているので、区切りながら読むといいと思います。
リスト 12.20 の演習はこんな感じにしました。
# パスワード再設定の属性を設定する def create_reset_digest self.reset_token = User.new_token update_columns(reset_digest: User.digest(reset_token), reset_sent_at: Time.zone.now) end
RubyMine だと : を => にするかとアドバイスが出てきますが、好みでいいと思います。
変えた場合はこのような書き方になりますね。わたしは : の書き方のほうに戻しておきました。
# パスワード再設定の属性を設定する def create_reset_digest self.reset_token = User.new_token update_columns(:reset_digest => User.digest(reset_token), :reset_sent_at => Time.zone.now) end
リスト 12.21 のマッチさせる文言はヒントにあるそのままですね。
password_resets_controller.rb の check_expiration メソッドで flash[:danger] として出しています。
test "expired token" do get new_password_reset_path post password_resets_path, params: { password_reset: { email: @user.email } } @user = assigns(:user) @user.update_attribute(:reset_sent_at, 3.hours.ago) patch password_reset_path(@user.reset_token), params: { email: @user.email, user: { password: "foobar", password_confirmation: "foobar" } } assert_response :redirect follow_redirect! assert_match /Password reset has expired./i, response.body end
演習の4つ目は、パスワードがリセットされたら reset_digest が nil になっていることを確認するというテストを追加します。
test "password resets" do ... # 有効なパスワードとパスワード確認 patch password_reset_path(user.reset_token), params: { email: user.email, user: { password: "foobaz", password_confirmation: "foobaz" } } assert is_logged_in? assert_not flash.empty? assert_nil user.reload.reset_digest assert_redirected_to user end
なかなか難しかったですね。
一からここまで考えてあれこれ作るのは大変だと思います。とても参考になります。