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
なかなか難しかったですね。
一からここまで考えてあれこれ作るのは大変だと思います。とても参考になります。
