OKADA LABO

[Ruby on rails][アクションdestroy]ユーザーが登録したものをユーザーのみが削除する

たとえば、ユーザーがツイートをするアプリがあるとして。

 

ユーザーはツイートをしていくが、
自分のツイートを削除したいなぁ。

というとき。

 

routes.rb

delete 'tweets/:id' => 'tweets#destroy'

 

メソッド delete が送られ、tweets/:idがリクエストされると
destroyアクションが実行され、ツイートが削除される流れです。

 

では、削除を実行するボタンがあるviewファイルはどうなるかというと

 

views/tweets/xxxxx.html.erb

<% @tweets.each do |tweet| %> ツイートを1件1件出力
  <% if user_signed_in? && current_user.id == tweet.user_id %> #ユーザーがログインしていて、なおかつ、ログイン者のidとツイートのuser_id(user_idには、ユーザーがツイートした際、そのユーザーのidが渡されている)がおなじ場合、削除ボタンを出力する
    <%= link_to '削除', "/tweets/#{tweet.id}", method: :delete %> #ここがボタン
  <% end %>
  <%= simple_format(tweet.text) %> #テキスト内容
  <span>投稿者</span><%= tweet.user.nickname %> #投稿者名
<% end %>

となる。
/tweets/#{tweet.id} は、リンク先は文字列なので、変数tweet.idを#{}で式展開して文字にしてあげる。

 

tweets コントローラには

tweets_controller.rb

def destroy
  tweet = Tweet.find(params[:id])
  if tweet.user_id == current_user.id
    tweet.destroy
  end
end

params[:id]で削除するレコードを見つける。
別のユーザが削除できないよう、if文。
(パスで削除機能を実行されないように)
ツイートのuser_idがログイン者のidと同じならば
destroy
.destroyメソッドは削除機能

 

あとは、views/tweets/destroy.html.erb

に 削除しました 表示すればよい