0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

【Rails】redirect_toを使うときはステータスコードを指定しよう!

Last updated at Posted at 2022-09-07

結論

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以外のメソッドを使用しよう。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?