0
0

More than 1 year has passed since last update.

railsチュートリアル第10章 管理ユーザー

Posted at

ユーザーを削除する

管理ユーザー

特権を持つ管理ユーザーを識別するために、論理値をとるadmin属性をUserモデルに追加

ubuntu:~/environment/sample_app (updating-users) $ rails generate migration add_admin_to_users admin:boolean
Running via Spring preloader in process 3171
      invoke  active_record
      create    db/migrate/20211016122254_add_admin_to_users.rb

boolean型のadmin属性をUserに追加するマイグレーション

db/migrate/[timestamp]_add_admin_to_users.rb

class AddAdminToUsers < ActiveRecord::Migration[6.0]
  def change
    add_column :users, :admin, :boolean, default: false
    # adminカラムがusersテーブルに追加されます。
    # default: false デフォルトでは管理者になれないということ
    # adminの値はデフォルトでnilになります
  end
end

admin属性の論理値

$ rails console --sandbox
>> user = User.first
>> user.admin?
=> false
>> user.toggle!(:admin)
# admin属性の状態をfalseからtrueに反転
=> true
>> user.admin?
=> true

サンプルデータ生成タスクに管理者を1人追加する

db/seeds.rb

# メインのサンプルユーザーを1人作成する
User.create!(name:  "Example User",
             email: "example@railstutorial.org",
             password:              "foobar",
             password_confirmation: "foobar",
             admin: true)
# create!は基本的にcreateメソッドと同じものですが、
#   ユーザーが無効な場合にfalseを返すのではなく例外を発生させる
# admin:trueにして管理者にする

# 追加のユーザーをまとめて生成する
# メイン以外のユーザー99人を作成
99.times do |n|
  name  = Faker::Name.name
  email = "example-#{n+1}@railstutorial.org"
  # 数ごとにメアドが変更される
  password = "password"
  # パスワードは変わらない
  User.create!(name:  name,
               email: email,
               password:              password,
               password_confirmation: password)
  # 許可された属性リストにadminが含まれていない
  # 任意のユーザーが自分自身にアプリケーションの
  #   管理者権限を与えることを防止

end
データベースをリセットして、サンプルデータを再度生成
$ rails db:migrate:reset
$ rails db:seed

演習

1.
Web経由でadmin属性を変更できないことを確認してみましょう。具体的には、リスト 10.56に示したように、PATCHを直接ユーザーのURL(/users/:id)に送信するテストを作成してみてください。テストが正しい振る舞いをしているかどうか確信を得るために、まずはadminをuser_paramsメソッド内の許可されたパラメータ一覧に追加するところから始めてみましょう。最初のテストの結果は red になるはずです。最後の行では、更新済みのユーザー情報をデータベースから読み込めることを確認します( 6.1.5)。

require 'test_helper'

class UsersControllerTest < ActionDispatch::IntegrationTest
.
.
.
  test "should not allow the admin attribute to be edited via the web" do
    log_in_as(@other_user)
    assert_not @other_user.admin?
    patch user_path(@other_user), params: {
                                    user: { password:              "password",
                                            password_confirmation: "password",
                                            admin: true } }
    assert_not @other_user.reload.admin?
    # レコードの再取得を行い、adminカラムを検証する
  end
.
.
.
end

今度のテストの意図が少し分かった。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0