ユーザーを削除する
管理ユーザー
特権を持つ管理ユーザーを識別するために、論理値をとる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
演習
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
今度のテストの意図が少し分かった。