【156日目】【1日20分のRailsチュートリアル】【第11章】マイクロポストを削除する
今日は「11.3.4 マイクロポストを削除する」から。
11.3.4 マイクロポストを削除する
最後の機能として、マイクロポストリソースにポストを削除する機能を追加します。これはユーザー削除と同様に(9.4.2)、"delete" リンクで実現します (図11.16)。
(中略)
カレントユーザーが作成したマイクロポストに対してのみ削除リンクが動作するようにします。
自分が投稿したマイクロポストしか消せないようにしないとね。
最初のステップとして、マイクロポストのパーシャル (リスト11.21) に削除リンクを追加します。
マイクロポストの投稿ユーザーとカレントユーザーが一致するときは削除リンクを表示する。
app/views/microposts/_micropost.html.erb
: <% if current_user?(micropost.user) %> <%= link_to "delete", micropost, method: :delete, data: { confirm: "You sure?" } %> <% end %> :
次に、Micropostsコントローラのdestroyアクションを定義しましょう。
(中略)
大きな違いは、admin_userフィルターで@user変数を使うのではなく、関連付けを使ってマイクロポストを見つけるようにしている点です。
マイクロポストのidは一意なので、カレントユーザーのマイクロポストからfindしたときに見つからない→カレントユーザーのマイクロポストじゃない→削除できない、ってできるってことかな。
削除リンクも表示させないけど、destroyアクション呼ばれたときにもチェックしてあるユーザーが他のユーザーのマイクロポストを削除しようとするのを防ぐのかー。
app/controllers/microposts_controller.rb
: before_action :correct_user, only: :destroy : def destroy @micropost.destroy flash[:success] = "Micropost deleted" redirect_to request.referrer || root_url end private : def correct_user @micropost = current_user.microposts.find_by(id: params[:id]) redirect_to root_url if @micropost.nil? end end
マイクロポストがHomeページから削除された場合でもProfileページから削除された場合でも、request.referrerを使うことでDELETEリクエストが発行されたページに戻すことができるので、非常に便利です。
URLって保存されてるんだなぁ…。
これらのコードにより、上から2番目のマイクロポストを削除すると、図 11.17のようにうまく動くはずです。
動作見てみよう。
サーバーを起動して
$ rails server -b $IP -p $PORT
上から2番目のマイクロポストを削除してみる。
確認のポップアップも表示されて
マイクロポストも削除できました。
今日の学習時間は【24分】。
次は「11.3.5 フィード画面におけるマイクロポストのテスト」から。