読者です 読者をやめる 読者になる 読者になる

ぞえの技術めも

Ruby on Rails勉強中

【103日目】【1日20分のRailsチュートリアル】【第9章】ユーザーフレンドリーな機能のテストを追加する

Ruby on Railsチュートリアル(第3版)

今日は「9.2.2 正しいユーザーを要求する」のリファクタリングから。

9.2.2 正しいユーザーを要求する

最後に、リファクタリングではありますが、一般的な慣習に倣ってcurrent_user?という論理値を返すメソッドを実装します。

あるユーザーが今ログインしているユーザーかどうかチェックするメソッドを実装する。

app/helpers/sessions_helper.rb

  # 与えられたユーザーがログイン済みユーザーであればtrueを返す
  def current_user?(user)
    user == current_user
  end

@user == current_usercurrent_user?で置き換えることでちょっと分かりやすいコードに。

app/controllers/users_controller.rb

    # 正しいユーザーかどうか確認
    def correct_user
      @user = User.find(params[:id])
      redirect_to(root_url) unless current_user?(@user)
    end

9.2.3 フレンドリーフォワーディング

(省略)後1つ小さなキズがあります。保護されたページにアクセスしようとすると、問答無用で自分のプロファイルページに移動させられてしまいます。

アクセスしようとしてたページに移動して欲しいよね。

実際のテストはまず編集ページにアクセスし、ログインした後に、(デフォルトのプロフィールページではなく) 編集ページにリダイレクトされているかどうかをチェックするといったテストです。

編集ページへのアクセスについてテストを下記のように修正。

test/integration/users_edit_test.rb

  :
  test "successful edit with friendly forwarding" do
    get edit_user_path(@user)
    log_in_as(@user)
    assert_redirected_to edit_user_path(@user)
    name  = "Foo Bar"
    email = "foo@bar.com"
    patch user_path(@user), user: { name:  name,
                                    email: email,
                                    password:              "",
                                    password_confirmation: "" }
    assert_not flash.empty?
    assert_redirected_to @user
    @user.reload
    assert_equal name,  @user.name
    assert_equal email, @user.email
  end
end

(なお、リダイレクトによってedit用のテンプレートが描画されなくなったので、リスト9.26では該当するテストを削除しています)

テスト内のこのコードのことかな。

    assert_template 'users/edit'

まだアクセスしようとしてたページにリダイレクトする処理は実装してないのでこの段階ではテストは失敗します。

$ bundle exec rake test
35 tests, 79 assertions, 1 failures, 0 errors, 0 skips

項の途中だけど今日はここまで。

今日の学習時間は【21分】

次は「9.2.3 フレンドリーフォワーディング」の処理を実装するところから。