普通にRails書いていてどうもうまくいかないところがあってはまったのでメモしておく。
フォーム埋めてcreate
アクションにPOSTしたあと、モデルのsaveが成功したらindex
アクションへリダイレクト、失敗したらもう1回new
をレンダリングというよくあるケース。これで保存に成功してindexにリダイレクトしたとき、なぜかURLに?notice=success
がくっついてしまうということがあった。
実際に書いたコード(とほぼ同じもの)はこちら。
def create
@entry = Entry.new(permitted_params)
if @entry.save
redirect_to action: :index, notice:"success"
else
render :new
end
end
実は上のコードだと問題があるが、気を抜いていたので見落としてしまった。
redirect_to
はこのようにハッシュの引数を2つ受け取る。
redirect_to(options = {}, response_status = {})
さきほどのケースでは暗黙のうちにaction
もnotice
も1つ目のハッシュであると解釈されてしまった。
redirect_to({action: :index, notice:"success"})
Rubyではメソッドの引数になるハッシュの波カッコは省略できるし、メソッドの引数も省略できることもあるのでどちらが優先されるのかが一見するとわかりにくい。
正しく動かすには以下のようにする必要がある。
def create
@entry = Entry.new(permitted_params)
if @entry.save
redirect_to({action: :index}, notice:"success")
else
render :new
end
end
一応これでうまくいった。