バリデーションエラーが起きた後、画面遷移せずにエラーメッセージも表示されなかったのでこれを解決するしました。
環境
Ruby 3.0.2
Rails 7.0.2.3
結論:Turboの動作をオフにする redirect_to
を使う
form_withに data: { turbo: false }
を追加する
render :new
としていた部分を redirect_to action: :new
に変更したら解決しました。
バリデーションエラーはflash
を使って取得しています。
EventsController.rb
def create
@event = events.new(event_params)
if @event.save
flash[:success] = "#{@event.name}を登録しました"
redirect_to @event
else
flash[:errors] = @event.errors.full_messages
redirect_to action: :new
# render :new だと動かない
end
end
発生していたエラー
バリデーションエラーが発生した際に、画面のリロードが発生せず、コンソールに以下のエラーが表示された。
Error: Form responses must redirect to another location at k.requestSucceededWithResponse
問題発生時のコード
new.html.haml (≒ new.html.erb)
= form_with model: @event do |f|
= f.label :name, 'イベント名'
= f.text_field :name
Event.rb
class Event < ApplicationRecord
has_many :items
belongs_to :user
validates :name, presence: true
EventsController.rb
class EventsController < ApplicationController
before_action :authenticate_user!
def new
@event = Event.new
end
def create
@event = current_user.events.new(event_params)
if @event.save
redirect_to action: :index
else
render :new
end
end
private
def event_params
params.require(:event).permit(:name, :event_datetime, :memo)
end
...
Turboって?
rails7からデフォルトで入っているGem
ざっくりですが、Javascriptを書かずに簡単にSPAを実現してくれる
参考