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

ぞえの技術めも

Ruby on Rails勉強中

【102日目】【1日20分のRailsチュートリアル】【第9章】ユーザーが自分の情報だけを編集できるように実装を追加する

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

今日は「9.2.2 正しいユーザーを要求する」から。

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

当然のことですが、ログインを要求するだけでは十分ではありません。ユーザーが自分の情報だけを編集できるようにする必要があります。

勝手に自分の情報を編集されたら困るもんね。

そこで本項では、セキュリティモデルが正しく実装されている確信を持つために、テスト駆動開発で進めていきます。

ほぅほぅ。

まずはユーザーの情報が互いに編集できないことを確認するために、サンプルユーザーをもう一人追加します。ユーザー用のfixtureファイルに2人目のユーザーを追加してみましょう (リスト9.20)。

2人目のユーザーを追加。

test/fixtures/users.yml

archer:
  name: Sterling Archer
  email: duchess@example.gov
  password_digest: <%= User.digest('password') %>

次に、 リスト8.50で定義したlog_in_asメソッドを使って、editアクションとupdateアクションをテストします (リスト9.21)。

setupでもう一つのユーザーとしてさっき追加ユーザーを設定して、
edit/updateアクションそれぞれでログインしているユーザーとは別のユーザーのプロフィールページを編集/更新をチェックするテストを追加。

test/controllers/users_controller_test.rb

  :
  def setup
    @user = users(:michael)
    @other_user = users(:archer)
  end
  :
  test "should redirect edit when logged in as wrong user" do
    log_in_as(@other_user)
    get :edit, id: @user
    assert flash.empty?
    assert_redirected_to root_url
  end

  test "should redirect update when logged in as wrong user" do
    log_in_as(@other_user)
    patch :update, id: @user, user: { name: @user.name, email: @user.email }
    assert flash.empty?
    assert_redirected_to root_url
  end
end

別のユーザーのプロフィールを編集しようとしたらリダイレクトさせたいので、correct_userというメソッドを作成し、beforeフィルターからこのメソッドを呼び出すようにします (リスト9.22)。

別のユーザーのプロフィールを編集しようとしたらルートURLにリダイレクトする処理を追加する。

app/controllers/users_controller.rb

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

beforeフィルターのcorrect_userで@user変数を定義しているため、リスト9.22ではeditとupdateの各アクションから、@userへの代入文を削除している点にも注意してください。

@user変数の定義は二重にはいらないってことかな。。。
コメントアウトしとこう。

  def edit
    # @user = User.find(params[:id])
  end

  def update
    # @user = User.find(params[:id])
    :

ここまで実装できたらさっき追加したテストが通るはずなので、テスト実行。

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

問題なし。

途中だけどキリがいいので今日はここまで。

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

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