ぞえの技術めも

Ruby on Rails勉強中

【156日目】【1日20分のRailsチュートリアル】【第11章】マイクロポストを削除する

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

今日は「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番目のマイクロポストを削除してみる。

確認のポップアップも表示されて

f:id:kt_zoe:20170626123549p:plain

マイクロポストも削除できました。

f:id:kt_zoe:20170626123606p:plain

今日の学習時間は【24分】

次は「11.3.5 フィード画面におけるマイクロポストのテスト」から。