RubyMine で Rails Tutorial 12章

  •  
  •  
  •  

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

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