【113日目】【1日20分のRailsチュートリアル】【第9章】destroyアクションを実装する
今日は「9.4.2 destroyアクション」から。
9.4.2 destroyアクション
Usersリソースの最後の仕上げとして、destroyアクションへのリンクを追加しましょう。
まず各ユーザーにユーザー削除用のリンクを追加。
app/views/users/_user.html.erb
<% if current_user.admin? && !current_user?(user) %> | <%= link_to "delete", user, method: :delete, data: { confirm: "You sure?" } %> <% end %>
ログイン中のユーザーが管理者権限を持っていて、かつログイン中とは違うユーザーだったらリンクを表示する。
自分自身を削除できたら色々問題になるからかな。
追加できたら見た目見てみよう。
サーバーを起動して
$ rails server -b $IP -p $PORT
<ローカルアドレス>/users
にアクセス。
delete
リンクが表示されました。
この削除リンクが動作するためには、destroyアクション (表7.1) を追加する必要があります。
destroyアクションを追加。
app/controllers/users_controller.rb
: before_action :logged_in_user, only: [:index, :edit, :update, :destroy] : def destroy User.find(params[:id]).destroy flash[:success] = "User deleted" redirect_to users_url end
これでユーザー削除処理が実装できました。
と思いきや
ある程度の腕前を持つ攻撃者なら、コマンドラインでDELETEリクエストを直接発行するという方法でサイトの全ユーザーを削除してしまうことができるでしょう。
それは危ない。防衛しましょう。
9.2.1と9.2.2と同じように、今回はbeforeフィルターを使ってdestroyアクションへのアクセスを制御します。実装するadmin_userフィルターをリスト9.54に示します。
管理者権限をもつユーザーのみがdestroyアクションにアクセスできるようにコード追加。
app/controllers/users_controller.rb
: before_action :admin_user, only: :destroy : private : # 管理者かどうか確認 def admin_user redirect_to(root_url) unless current_user.admin? end end
これでユーザー削除処理の実装完了。
実際にユーザー削除してみたいけど追加し直すのもめんどくさいので動作確認はテストを書いて確認しよう。
今日の学習時間は【26分】。
次は「9.4.3 ユーザー削除のテスト」から。