結論
redirect_toをstatusオプションなしで使用すると思わぬ事故が起きることがある。
なのでstatusオプションを使ってステータスコードを指定するかredirect_to以外のメソッドを使用しよう。
redirect_toについて
起きたこと
このRailsのチュートリアル?をやっていたところステータスコードを指定しないでredirect_toを使用したら思わぬ挙動が発生した。
blogアプリで記事にコメントをつけて、そのコメントを削除すると記事も削除された!!!
コメント削除のviewファイル
<p>
<%= link_to "Destroy comment", [comment.article, comment], data: {
turbo_method: :delete,
turbo_confirm: "Are you sure?"
} %>
</p>
comments_controller.rb
def destroy
@article = Article.find(params[:article_id])
@comment = @article.comments.find(params[:id])
@comment.destroy
redirect_to article_path(@article)
end
やっていることは記事をパラメータの記事ID指定で取得する。
その記事がもつコメントの中から、パラメータの(コメントの)ID指定でコメントを取得する。
そのコメントを削除したら、article_path(articleのshow)にリダイレクトする。
ということをやっているはずだった。
けれど、redirect_toにstatusオプションをつけないで使用したために記事まで削除されてしまった。
原因
redirect_toにはstatusオプションを指定することでステータスコードを指定することができる機能がある。
redirect_to post_url(@post), status: 301
そして、指定しないときはstatus: 302がデフォルトになっている。←これが原因
仕様書ではリダイレクトの際にメソッド (と本文) を変更しないよう要求しています
つまり、deleteメソッドをarticle_pathにリダイレクトしてしまっていた。
なのでrailsはdeleteメソッドに対応するアクションを実行して記事を削除してしまった。
確かにリダイレクトだからそーゆーもんかというような気もする ←事後諸葛亮
結論
redirect_toをstatusオプションなしで使用すると思わぬ事故が起きることがある。
なのでstatusオプションを使ってステータスコードを指定するかredirect_to以外のメソッドを使用しよう。