サンプルデータ生成タスクにadminユーザーを1人追加します。
db/seeds.rb
User.create!([{ name: "suzutuki", email: "example@railstutorial.org", password: "suzu", password_confirmation: "suzu", admin: true }, { name: "suzu", email: "suzu1@railstutorial.org", password: "suzu", password_confirmation: "suzu"}, { name: "suzu", email: "suzu2@railstutorial.org", password: "suzu", password_confirmation: "suzu"}, { name: "suzu", email: "suzue3@railstutorial.org", password: "suzu", password_confirmation: "suzu"}])
seedファイルを使う時にはデータベースをリセットします。
docker-compose run web bundle exec rails db:migrate:reset
データベース上にサンプルユーザーを生成します。
docker-compose run web bundle exec rails db:seed
users_contorollerに以下の記述を追加します。
before_action :admin_user, only: [:show] def destroy @user = User.find(params[:id]) @user.destroy if correct_user || admin_user end private def user_params params.require(:user).permit(:name, :email, :password, :image, :password_confirmation) end # 正しいユーザーかどうか確認する def correct_user @user = User.find(params[:id]) redirect_to(root_url) unless current_user?(@user) end # 管理者かどうか確認する def admin_user redirect_to(root_url) unless current_user.admin? end
任意のユーザーが自分自身にアプリケーションの管理者権限を与えることを防止できます。
ユーザー削除用リンクの実装をします。 (管理者にのみ表示されます)
app/views/users/show.html.erb
<% @users.each do |user| %> <%= user.name %> <%= user.email %> <% if user.image? %> <%= image_tag user.image.thumb100.url %> <% end %> <% if current_user.admin? && !current_user?(user) %> <%= link_to "このユーザーを削除します", user, method: :delete, data: { confirm: "本当にユーザーを削除しますか?" }%> <% end %> <% end %>
ユーザー削除用リンクの実装をします。
app/views/users/edit.html.erb
<% if logged_in?%> <%= link_to "退会", @user, method: :delete, data: { confirm: "本当に退会しますか?" } %> <% end %>
sessions_helper.rb # ユーザーがログインしていればtrue、その他ならfalseを返す def logged_in? !current_user.nil? end
退会処理が実装できた!