読者です 読者をやめる 読者になる 読者になる

ぞえの技術めも

Ruby on Rails勉強中

【113日目】【1日20分のRailsチュートリアル】【第9章】destroyアクションを実装する

Ruby on Railsチュートリアル(第3版)

今日は「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にアクセス。

f:id:kt_zoe:20170222123625p:plain

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 ユーザー削除のテスト」から。