[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
に 削除しました 表示すればよい