1
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 7.0で、renderを使うとエラーが出た

Posted at

はじめに

Railsの学習をProgate(Rails 5)から始めました。その後に自分で環境構築をしたのですが、Rails 7.0にした影響でいろんなところで詰まりました。今回はその中から、アクション内でrenderを使うとエラーになる問題について紹介します。

Rails : 7.0.5

エラーの再現

簡単なTodoアプリを想定します。
タスクが未入力のときに自分で設定したエラーメッセージを表示したいときは、次のようにrenderを使って、アクション内で定義した変数をViewで使用すればいいと思いました。

routes.rb
  get "todos/new", to: "todos#new"
  post "todos/create", to: "todos#create"
new.html.erb
  <% if @error_message %>
    <%= @error_message %>
  <% end %>

  <%= form_tag("/todos/create") do %>
  <form>
    <input type="text" placeholder="タスクを入力する" name="title">
    <input type="submit" value="保存する">
  </form>
  <% end %>
todos_controller.rb
def create
  @todo = Todo.new(title: params[:title])
  if @todo.save
    redirect_to("/todos")
  else
    @error_message = "タスクを入力してください"
    render :new
  end
end

しかし次のようなエラーが出てしまいます。  
Error: Form responses must redirect to another location
自分で設定したエラーメッセージも表示されません。
must redirect とあるのでもしかすると redirect_to の挙動が変わったのかと思い試してみても、やはり@error_messageは引き継がれませんでした。  

解決策  

調べた結果、こちら1からのこちら2に行き着き、次のようにstatusを指定すれば想定通りにエラーメッセージを表示することができました。  

todos_controller.rb
def create
  @todo = Todo.new(title: params[:title])
  if @todo.save
    redirect_to("/todos")
  else
    @error_message = "タスクを入力してください"
    # status: 422 を追記
    render :new, status: 422
  end
end

同様にstatusに500を指定してもメッセージが表示され、コンソール上ではステータスの意味通りのエラーが出ていました。

原因 

原因としてはリンク先2にあるように、ステータスにより挙動が違うことがTurboの仕様だから、ということになるようです。Turboがデフォルトで組み込まれたのはRails 7.0以降3なので、statusが必要なのもRails 7.0以降の話なのでしょう。Turboについてよくわかっていませんが…

  1. https://stackoverflow.com/questions/70400958/error-form-responses-must-redirect-to-another-location

  2. https://turbo.hotwired.dev/handbook/drive#redirecting-after-a-form-submission 2

  3. https://github.com/hotwired/turbo-rails

1
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
1
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?