railsチュートリアル第10章 正しいユーザーを要求する

###正しいユーザーを要求する
セキュリティモデルが正しく実装されている確信を持つために、テスト駆動開発で進めていきます。
Usersコントローラのテストを補完するように、テストを追加するところから始めていきます。

####fixtureファイルに２人目のユーザーを追加する
test/fixtures/users.yml

```
michael:
  name: Michael Example
  email: michael@example.com
  password_digest: <%= User.digest('password') %>

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

####間違ったユーザーが編集しようとしたときのテスト
test/controllers/users_controller_test.rb

```rb
require 'test_helper'

class UsersControllerTest < ActionDispatch::IntegrationTest
.
.
.
  test "should redirect edit when logged in as wrong user" do
    log_in_as(@other_user)
    get edit_user_path(@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 user_path(@user), params: { user: { name: @user.name,
                                              email: @user.email } }
    assert flash.empty?
    assert_redirected_to root_url
  end
end
```

####beforeフィルターを使って編集/更新ページを保護する
app/controllers/users_controller.rb

```rb
class UsersController < ApplicationController
  before_action :logged_in_user, only: [:edit, :update]
  before_action :correct_user,   only: [:edit, :update]
  # before_actionメソッドを使って何らかの処理が実行される直前に
  # 特定のメソッドを実行する仕組み
  # ログインをさせる
  # :editと:updateアクションだけ
.
.
.
    # ログイン済みユーザーかどうか確認
    def logged_in_user
      unless logged_in?
      # もしも、評価が偽(false)であれば○○する
        flash[:danger] = "Please log in."
        # ログインされていなければメッセージを表示する
        redirect_to login_url
        # ログインページを表示させる
      end
    end
    
    # 正しいユーザーかどうか確認
    def correct_user
      @user = User.find(params[:id])
      redirect_to(root_url) unless @user == current_user
      # データベースと照らし合わせて無かったらホーム画面にいく。
    end
end
```
#####テスト
```
ubuntu:~/environment/sample_app (updating-users) $ rails t
Running via Spring preloader in process 21855
Started with run options --seed 35762

  35/35: [============================] 100% Time: 00:00:03, Time: 00:00:03

Finished in 3.49451s
35 tests, 85 assertions, 0 failures, 0 errors, 0 skips
```

####current_user?メソッド
app/helpers/sessions_helper.rb

```rb
module SessionsHelper
.
.
.
   # 記憶トークンcookieに対応するユーザーを返す
  def current_user
    if (user_id = session[:user_id])
    # ログイン中のidを代入する
    # 永続セッション（ログイン中）にするため
      @current_user ||= User.find_by(id: user_id)
      # カレントユーザーまたは検索結果があったものを代入する
    elsif (user_id = cookies.signed[:user_id])
    # 
      user = User.find_by(id: user_id)
      # idでユーザーを探す
      if user && user.authenticated?(cookies[:remember_token])
        # ユーザーが有効であり、記憶トークンも認証されたら
        log_in user
        # ログインする
        @current_user = user
        # カレントユーザーに代入するかな
      end
    end
  end
  
  # 渡されたユーザーがカレントユーザーであればtrueを返す
  def current_user?(user)
    user && user == current_user
    # 有効且つデータベースにあるか？
    # trueを返す
  end
.
.
.
end
```

#######正しいユーザーを要求する
セキュリティモデルが正しく実装されている確信を持つために、テスト駆動開発で進めていきます。
Usersコントローラのテストを補完するように、テストを追加するところから始めていきます。

####fixtureファイルに２人目のユーザーを追加する
test/fixtures/users.yml

```
michael:
  name: Michael Example
  email: michael@example.com
  password_digest: <%= User.digest('password') %>

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

####間違ったユーザーが編集しようとしたときのテスト
test/controllers/users_controller_test.rb

```rb
require 'test_helper'

class UsersControllerTest < ActionDispatch::IntegrationTest
.
.
.
  test "should redirect edit when logged in as wrong user" do
    log_in_as(@other_user)
    get edit_user_path(@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 user_path(@user), params: { user: { name: @user.name,
                                              email: @user.email } }
    assert flash.empty?
    assert_redirected_to root_url
  end
end
```

####beforeフィルターを使って編集/更新ページを保護する
app/controllers/users_controller.rb

```rb
class UsersController < ApplicationController
  before_action :logged_in_user, only: [:edit, :update]
  before_action :correct_user,   only: [:edit, :update]
  # before_actionメソッドを使って何らかの処理が実行される直前に
  # 特定のメソッドを実行する仕組み
  # ログインをさせる
  # :editと:updateアクションだけ
.
.
.
    # ログイン済みユーザーかどうか確認
    def logged_in_user
      unless logged_in?
      # もしも、評価が偽(false)であれば○○する
        flash[:danger] = "Please log in."
        # ログインされていなければメッセージを表示する
        redirect_to login_url
        # ログインページを表示させる
      end
    end
    
    # 正しいユーザーかどうか確認
    def correct_user
      @user = User.find(params[:id])
      redirect_to(root_url) unless @user == current_user
      # データベースと照らし合わせて無かったらホーム画面にいく。
    end
end
```
#####テスト
```
ubuntu:~/environment/sample_app (updating-users) $ rails t
Running via Spring preloader in process 21855
Started with run options --seed 35762

  35/35: [============================] 100% Time: 00:00:03, Time: 00:00:03

Finished in 3.49451s
35 tests, 85 assertions, 0 failures, 0 errors, 0 skips
```

####current_user?メソッド
app/helpers/sessions_helper.rb

```rb
module SessionsHelper
.
.
.
   # 記憶トークンcookieに対応するユーザーを返す
  def current_user
    if (user_id = session[:user_id])
    # ログイン中のidを代入する
    # 永続セッション（ログイン中）にするため
      @current_user ||= User.find_by(id: user_id)
      # カレントユーザーまたは検索結果があったものを代入する
    elsif (user_id = cookies.signed[:user_id])
    # 
      user = User.find_by(id: user_id)
      # idでユーザーを探す
      if user && user.authenticated?(cookies[:remember_token])
        # ユーザーが有効であり、記憶トークンも認証されたら
        log_in user
        # ログインする
        @current_user = user
        # カレントユーザーに代入するかな
      end
    end
  end
  
  # 渡されたユーザーがカレントユーザーであればtrueを返す
  def current_user?(user)
    user && user == current_user
    # 有効且つデータベースにあるか？
    # trueを返す
  end
.
.
.
end
```

#######正しいユーザーを要求する
セキュリティモデルが正しく実装されている確信を持つために、テスト駆動開発で進めていきます。
Usersコントローラのテストを補完するように、テストを追加するところから始めていきます。

####fixtureファイルに２人目のユーザーを追加する
test/fixtures/users.yml

```
michael:
  name: Michael Example
  email: michael@example.com
  password_digest: <%= User.digest('password') %>

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

####間違ったユーザーが編集しようとしたときのテスト
test/controllers/users_controller_test.rb

```rb
require 'test_helper'

class UsersControllerTest < ActionDispatch::IntegrationTest
.
.
.
  test "should redirect edit when logged in as wrong user" do
    log_in_as(@other_user)
    get edit_user_path(@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 user_path(@user), params: { user: { name: @user.name,
                                              email: @user.email } }
    assert flash.empty?
    assert_redirected_to root_url
  end
end
```

####beforeフィルターを使って編集/更新ページを保護する
app/controllers/users_controller.rb

```rb
class UsersController < ApplicationController
  before_action :logged_in_user, only: [:edit, :update]
  before_action :correct_user,   only: [:edit, :update]
  # before_actionメソッドを使って何らかの処理が実行される直前に
  # 特定のメソッドを実行する仕組み
  # ログインをさせる
  # :editと:updateアクションだけ
.
.
.
    # ログイン済みユーザーかどうか確認
    def logged_in_user
      unless logged_in?
      # もしも、評価が偽(false)であれば○○する
        flash[:danger] = "Please log in."
        # ログインされていなければメッセージを表示する
        redirect_to login_url
        # ログインページを表示させる
      end
    end
    
    # 正しいユーザーかどうか確認
    def correct_user
      @user = User.find(params[:id])
      redirect_to(root_url) unless @user == current_user
      # データベースと照らし合わせて無かったらホーム画面にいく。
    end
end
```
#####テスト
```
ubuntu:~/environment/sample_app (updating-users) $ rails t
Running via Spring preloader in process 21855
Started with run options --seed 35762

  35/35: [============================] 100% Time: 00:00:03, Time: 00:00:03

Finished in 3.49451s
35 tests, 85 assertions, 0 failures, 0 errors, 0 skips
```

####current_user?メソッド
app/helpers/sessions_helper.rb

```rb
module SessionsHelper
.
.
.
   # 記憶トークンcookieに対応するユーザーを返す
  def current_user
    if (user_id = session[:user_id])
    # ログイン中のidを代入する
    # 永続セッション（ログイン中）にするため
      @current_user ||= User.find_by(id: user_id)
      # カレントユーザーまたは検索結果があったものを代入する
    elsif (user_id = cookies.signed[:user_id])
    # 
      user = User.find_by(id: user_id)
      # idでユーザーを探す
      if user && user.authenticated?(cookies[:remember_token])
        # ユーザーが有効であり、記憶トークンも認証されたら
        log_in user
        # ログインする
        @current_user = user
        # カレントユーザーに代入するかな
      end
    end
  end
  
  # 渡されたユーザーがカレントユーザーであればtrueを返す
  def current_user?(user)
    user && user == current_user
    # 有効且つデータベースにあるか？
    # trueを返す
  end
.
.
.
end
```

#######正しいユーザーを要求する
セキュリティモデルが正しく実装されている確信を持つために、テスト駆動開発で進めていきます。
Usersコントローラのテストを補完するように、テストを追加するところから始めていきます。

####fixtureファイルに２人目のユーザーを追加する
test/fixtures/users.yml

```
michael:
  name: Michael Example
  email: michael@example.com
  password_digest: <%= User.digest('password') %>

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

####間違ったユーザーが編集しようとしたときのテスト
test/controllers/users_controller_test.rb

```rb
require 'test_helper'

class UsersControllerTest < ActionDispatch::IntegrationTest
.
.
.
  test "should redirect edit when logged in as wrong user" do
    log_in_as(@other_user)
    get edit_user_path(@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 user_path(@user), params: { user: { name: @user.name,
                                              email: @user.email } }
    assert flash.empty?
    assert_redirected_to root_url
  end
end
```

####beforeフィルターを使って編集/更新ページを保護する
app/controllers/users_controller.rb

```rb
class UsersController < ApplicationController
  before_action :logged_in_user, only: [:edit, :update]
  before_action :correct_user,   only: [:edit, :update]
  # before_actionメソッドを使って何らかの処理が実行される直前に
  # 特定のメソッドを実行する仕組み
  # ログインをさせる
  # :editと:updateアクションだけ
.
.
.
    # ログイン済みユーザーかどうか確認
    def logged_in_user
      unless logged_in?
      # もしも、評価が偽(false)であれば○○する
        flash[:danger] = "Please log in."
        # ログインされていなければメッセージを表示する
        redirect_to login_url
        # ログインページを表示させる
      end
    end
    
    # 正しいユーザーかどうか確認
    def correct_user
      @user = User.find(params[:id])
      redirect_to(root_url) unless @user == current_user
      # データベースと照らし合わせて無かったらホーム画面にいく。
    end
end
```
#####テスト
```
ubuntu:~/environment/sample_app (updating-users) $ rails t
Running via Spring preloader in process 21855
Started with run options --seed 35762

  35/35: [============================] 100% Time: 00:00:03, Time: 00:00:03

Finished in 3.49451s
35 tests, 85 assertions, 0 failures, 0 errors, 0 skips
```

####current_user?メソッド
app/helpers/sessions_helper.rb

```rb
module SessionsHelper
.
.
.
   # 記憶トークンcookieに対応するユーザーを返す
  def current_user
    if (user_id = session[:user_id])
    # ログイン中のidを代入する
    # 永続セッション（ログイン中）にするため
      @current_user ||= User.find_by(id: user_id)
      # カレントユーザーまたは検索結果があったものを代入する
    elsif (user_id = cookies.signed[:user_id])
    # 
      user = User.find_by(id: user_id)
      # idでユーザーを探す
      if user && user.authenticated?(cookies[:remember_token])
        # ユーザーが有効であり、記憶トークンも認証されたら
        log_in user
        # ログインする
        @current_user = user
        # カレントユーザーに代入するかな
      end
    end
  end
  
  # 渡されたユーザーがカレントユーザーであればtrueを返す
  def current_user?(user)
    user && user == current_user
    # 有効且つデータベースにあるか？
    # trueを返す
  end
.
.
.
end
```

#######正しいユーザーを要求する
セキュリティモデルが正しく実装されている確信を持つために、テスト駆動開発で進めていきます。
Usersコントローラのテストを補完するように、テストを追加するところから始めていきます。

####fixtureファイルに２人目のユーザーを追加する
test/fixtures/users.yml

```
michael:
  name: Michael Example
  email: michael@example.com
  password_digest: <%= User.digest('password') %>

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

####間違ったユーザーが編集しようとしたときのテスト
test/controllers/users_controller_test.rb

```rb
require 'test_helper'

class UsersControllerTest < ActionDispatch::IntegrationTest
.
.
.
  test "should redirect edit when logged in as wrong user" do
    log_in_as(@other_user)
    get edit_user_path(@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 user_path(@user), params: { user: { name: @user.name,
                                              email: @user.email } }
    assert flash.empty?
    assert_redirected_to root_url
  end
end
```

####beforeフィルターを使って編集/更新ページを保護する
app/controllers/users_controller.rb

```rb
class UsersController < ApplicationController
  before_action :logged_in_user, only: [:edit, :update]
  before_action :correct_user,   only: [:edit, :update]
  # before_actionメソッドを使って何らかの処理が実行される直前に
  # 特定のメソッドを実行する仕組み
  # ログインをさせる
  # :editと:updateアクションだけ
.
.
.
    # ログイン済みユーザーかどうか確認
    def logged_in_user
      unless logged_in?
      # もしも、評価が偽(false)であれば○○する
        flash[:danger] = "Please log in."
        # ログインされていなければメッセージを表示する
        redirect_to login_url
        # ログインページを表示させる
      end
    end
    
    # 正しいユーザーかどうか確認
    def correct_user
      @user = User.find(params[:id])
      redirect_to(root_url) unless @user == current_user
      # データベースと照らし合わせて無かったらホーム画面にいく。
    end
end
```
#####テスト
```
ubuntu:~/environment/sample_app (updating-users) $ rails t
Running via Spring preloader in process 21855
Started with run options --seed 35762

  35/35: [============================] 100% Time: 00:00:03, Time: 00:00:03

Finished in 3.49451s
35 tests, 85 assertions, 0 failures, 0 errors, 0 skips
```

####current_user?メソッド
app/helpers/sessions_helper.rb

```rb
module SessionsHelper
.
.
.
   # 記憶トークンcookieに対応するユーザーを返す
  def current_user
    if (user_id = session[:user_id])
    # ログイン中のidを代入する
    # 永続セッション（ログイン中）にするため
      @current_user ||= User.find_by(id: user_id)
      # カレントユーザーまたは検索結果があったものを代入する
    elsif (user_id = cookies.signed[:user_id])
    # 
      user = User.find_by(id: user_id)
      # idでユーザーを探す
      if user && user.authenticated?(cookies[:remember_token])
        # ユーザーが有効であり、記憶トークンも認証されたら
        log_in user
        # ログインする
        @current_user = user
        # カレントユーザーに代入するかな
      end
    end
  end
  
  # 渡されたユーザーがカレントユーザーであればtrueを返す
  def current_user?(user)
    user && user == current_user
    # 有効且つデータベースにあるか？
    # trueを返す
  end
.
.
.
end
```

#######正しいユーザーを要求する
セキュリティモデルが正しく実装されている確信を持つために、テスト駆動開発で進めていきます。
Usersコントローラのテストを補完するように、テストを追加するところから始めていきます。

####fixtureファイルに２人目のユーザーを追加する
test/fixtures/users.yml

```
michael:
  name: Michael Example
  email: michael@example.com
  password_digest: <%= User.digest('password') %>

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

####間違ったユーザーが編集しようとしたときのテスト
test/controllers/users_controller_test.rb

```rb
require 'test_helper'

class UsersControllerTest < ActionDispatch::IntegrationTest
.
.
.
  test "should redirect edit when logged in as wrong user" do
    log_in_as(@other_user)
    get edit_user_path(@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 user_path(@user), params: { user: { name: @user.name,
                                              email: @user.email } }
    assert flash.empty?
    assert_redirected_to root_url
  end
end
```

####beforeフィルターを使って編集/更新ページを保護する
app/controllers/users_controller.rb

```rb
class UsersController < ApplicationController
  before_action :logged_in_user, only: [:edit, :update]
  before_action :correct_user,   only: [:edit, :update]
  # before_actionメソッドを使って何らかの処理が実行される直前に
  # 特定のメソッドを実行する仕組み
  # ログインをさせる
  # :editと:updateアクションだけ
.
.
.
    # ログイン済みユーザーかどうか確認
    def logged_in_user
      unless logged_in?
      # もしも、評価が偽(false)であれば○○する
        flash[:danger] = "Please log in."
        # ログインされていなければメッセージを表示する
        redirect_to login_url
        # ログインページを表示させる
      end
    end
    
    # 正しいユーザーかどうか確認
    def correct_user
      @user = User.find(params[:id])
      redirect_to(root_url) unless @user == current_user
      # データベースと照らし合わせて無かったらホーム画面にいく。
    end
end
```
#####テスト
```
ubuntu:~/environment/sample_app (updating-users) $ rails t
Running via Spring preloader in process 21855
Started with run options --seed 35762

  35/35: [============================] 100% Time: 00:00:03, Time: 00:00:03

Finished in 3.49451s
35 tests, 85 assertions, 0 failures, 0 errors, 0 skips
```

####current_user?メソッド
app/helpers/sessions_helper.rb

```rb
module SessionsHelper
.
.
.
   # 記憶トークンcookieに対応するユーザーを返す
  def current_user
    if (user_id = session[:user_id])
    # ログイン中のidを代入する
    # 永続セッション（ログイン中）にするため
      @current_user ||= User.find_by(id: user_id)
      # カレントユーザーまたは検索結果があったものを代入する
    elsif (user_id = cookies.signed[:user_id])
    # 
      user = User.find_by(id: user_id)
      # idでユーザーを探す
      if user && user.authenticated?(cookies[:remember_token])
        # ユーザーが有効であり、記憶トークンも認証されたら
        log_in user
        # ログインする
        @current_user = user
        # カレントユーザーに代入するかな
      end
    end
  end
  
  # 渡されたユーザーがカレントユーザーであればtrueを返す
  def current_user?(user)
    user && user == current_user
    # 有効且つデータベースにあるか？
    # trueを返す
  end
.
.
.
end
```

#######正しいユーザーを要求する
セキュリティモデルが正しく実装されている確信を持つために、テスト駆動開発で進めていきます。
Usersコントローラのテストを補完するように、テストを追加するところから始めていきます。

####fixtureファイルに２人目のユーザーを追加する
test/fixtures/users.yml

```
michael:
  name: Michael Example
  email: michael@example.com
  password_digest: <%= User.digest('password') %>

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

####間違ったユーザーが編集しようとしたときのテスト
test/controllers/users_controller_test.rb

```rb
require 'test_helper'

class UsersControllerTest < ActionDispatch::IntegrationTest
.
.
.
  test "should redirect edit when logged in as wrong user" do
    log_in_as(@other_user)
    get edit_user_path(@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 user_path(@user), params: { user: { name: @user.name,
                                              email: @user.email } }
    assert flash.empty?
    assert_redirected_to root_url
  end
end
```

####beforeフィルターを使って編集/更新ページを保護する
app/controllers/users_controller.rb

```rb
class UsersController < ApplicationController
  before_action :logged_in_user, only: [:edit, :update]
  before_action :correct_user,   only: [:edit, :update]
  # before_actionメソッドを使って何らかの処理が実行される直前に
  # 特定のメソッドを実行する仕組み
  # ログインをさせる
  # :editと:updateアクションだけ
.
.
.
    # ログイン済みユーザーかどうか確認
    def logged_in_user
      unless logged_in?
      # もしも、評価が偽(false)であれば○○する
        flash[:danger] = "Please log in."
        # ログインされていなければメッセージを表示する
        redirect_to login_url
        # ログインページを表示させる
      end
    end
    
    # 正しいユーザーかどうか確認
    def correct_user
      @user = User.find(params[:id])
      redirect_to(root_url) unless @user == current_user
      # データベースと照らし合わせて無かったらホーム画面にいく。
    end
end
```
#####テスト
```
ubuntu:~/environment/sample_app (updating-users) $ rails t
Running via Spring preloader in process 21855
Started with run options --seed 35762

  35/35: [============================] 100% Time: 00:00:03, Time: 00:00:03

Finished in 3.49451s
35 tests, 85 assertions, 0 failures, 0 errors, 0 skips
```

####current_user?メソッド
app/helpers/sessions_helper.rb

```rb
module SessionsHelper
.
.
.
   # 記憶トークンcookieに対応するユーザーを返す
  def current_user
    if (user_id = session[:user_id])
    # ログイン中のidを代入する
    # 永続セッション（ログイン中）にするため
      @current_user ||= User.find_by(id: user_id)
      # カレントユーザーまたは検索結果があったものを代入する
    elsif (user_id = cookies.signed[:user_id])
    # 
      user = User.find_by(id: user_id)
      # idでユーザーを探す
      if user && user.authenticated?(cookies[:remember_token])
        # ユーザーが有効であり、記憶トークンも認証されたら
        log_in user
        # ログインする
        @current_user = user
        # カレントユーザーに代入するかな
      end
    end
  end
  
  # 渡されたユーザーがカレントユーザーであればtrueを返す
  def current_user?(user)
    user && user == current_user
    # 有効且つデータベースにあるか？
    # trueを返す
  end
.
.
.
end
```

#######正しいユーザーを要求する
セキュリティモデルが正しく実装されている確信を持つために、テスト駆動開発で進めていきます。
Usersコントローラのテストを補完するように、テストを追加するところから始めていきます。

####fixtureファイルに２人目のユーザーを追加する
test/fixtures/users.yml

```
michael:
  name: Michael Example
  email: michael@example.com
  password_digest: <%= User.digest('password') %>

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

####間違ったユーザーが編集しようとしたときのテスト
test/controllers/users_controller_test.rb

```rb
require 'test_helper'

class UsersControllerTest < ActionDispatch::IntegrationTest
.
.
.
  test "should redirect edit when logged in as wrong user" do
    log_in_as(@other_user)
    get edit_user_path(@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 user_path(@user), params: { user: { name: @user.name,
                                              email: @user.email } }
    assert flash.empty?
    assert_redirected_to root_url
  end
end
```

####beforeフィルターを使って編集/更新ページを保護する
app/controllers/users_controller.rb

```rb
class UsersController < ApplicationController
  before_action :logged_in_user, only: [:edit, :update]
  before_action :correct_user,   only: [:edit, :update]
  # before_actionメソッドを使って何らかの処理が実行される直前に
  # 特定のメソッドを実行する仕組み
  # ログインをさせる
  # :editと:updateアクションだけ
.
.
.
    # ログイン済みユーザーかどうか確認
    def logged_in_user
      unless logged_in?
      # もしも、評価が偽(false)であれば○○する
        flash[:danger] = "Please log in."
        # ログインされていなければメッセージを表示する
        redirect_to login_url
        # ログインページを表示させる
      end
    end
    
    # 正しいユーザーかどうか確認
    def correct_user
      @user = User.find(params[:id])
      redirect_to(root_url) unless @user == current_user
      # データベースと照らし合わせて無かったらホーム画面にいく。
    end
end
```
#####テスト
```
ubuntu:~/environment/sample_app (updating-users) $ rails t
Running via Spring preloader in process 21855
Started with run options --seed 35762

  35/35: [============================] 100% Time: 00:00:03, Time: 00:00:03

Finished in 3.49451s
35 tests, 85 assertions, 0 failures, 0 errors, 0 skips
```

####current_user?メソッド
app/helpers/sessions_helper.rb

```rb
module SessionsHelper
.
.
.
   # 記憶トークンcookieに対応するユーザーを返す
  def current_user
    if (user_id = session[:user_id])
    # ログイン中のidを代入する
    # 永続セッション（ログイン中）にするため
      @current_user ||= User.find_by(id: user_id)
      # カレントユーザーまたは検索結果があったものを代入する
    elsif (user_id = cookies.signed[:user_id])
    # 
      user = User.find_by(id: user_id)
      # idでユーザーを探す
      if user && user.authenticated?(cookies[:remember_token])
        # ユーザーが有効であり、記憶トークンも認証されたら
        log_in user
        # ログインする
        @current_user = user
        # カレントユーザーに代入するかな
      end
    end
  end
  
  # 渡されたユーザーがカレントユーザーであればtrueを返す
  def current_user?(user)
    user && user == current_user
    # 有効且つデータベースにあるか？
    # trueを返す
  end
.
.
.
end
```

####最終的なcorrect_userの実装
app/controllers/users_controller.rb

```rb
class UsersController < ApplicationController
.
.
.   
    # 正しいユーザーかどうか確認
    def correct_user
      @user = User.find(params[:id])
      redirect_to(root_url) unless @user == current_user
      # データベースと照らし合わせて無かったらホーム画面にいく。
    end
end
```

###演習
1.
何故editアクションとupdateアクションを両方とも保護する必要があるのでしょうか? 考えてみてください。

ユーザーでは無い人が書き換えることができるから 
2.
上記のアクションのうち、どちらがブラウザで簡単にテストできるアクションでしょうか?

GETメソッドのeditの方がURLを打ち込んでアクセスするのみだから　editアクションらしい。