newアクションのバリデーションエラー後のURLの挙動とそれに伴うエラーについて
初めて質問させていただきます。ちょっと質問が長いのですが出来る限り噛み砕くのでお詳しい方ご教示頂けましたら幸いです。
当方の環境ではRailsで新規投稿をするとき、バリデーションに引っかかった際には、URLは以下のように変化します。
ttp://localhost:3000/posts/new
↓↓↓
ttp://localhost:3000/posts
必要ないかもしれませんが、Controller側はこんな感じを想定。
def new
@post = Post.new
@post.build
end
def create
@post = current_user.posts.build(post_params)
if @post.save
redirect_to post_path, notice: 'Post was successfully created.'
else
render action: :new
end
end
URLは気になりますが、この際、バリデーションに引っかかった時点ではフォームの中身も保持されており、URLさえ気にしなければ問題ないと思っています。
ただし、ブラウザボタンで1度戻って(ttp://localhost:3000/posts/new)、再度進んだ場合(ttp://localhost:3000/posts)、この際にはURLの通りindexアクションが読み込まれるため、入力した内容が消えてしまいます。
indexアクションを設定していない場合、以下のようなエラーが出ます。
PostsController#index is missing a template for this request format and >variant. request.formats: ["text/html"] request.variant: [] NOTE! For >XHR/Ajax or API requests, this action would normally respond with 204 No >Content: an empty white screen.
コントローラーでindexアクションを以下のように書けば一応フォームは出現させられますが、フォームの内容は消えますしなんだか強引な気がしています。
def index
@post = Post.new
@post.build
render action: :new
end
Railsユーザーの皆様はこのような自体をどのように処理しているのでしょうか?
スマートな解決策としては
・バリデーションエラー後にもURLを変化させない(/post/newのまま)
というのが1番手っ取り早い気がするのですがやり方がわからないのと、Railsがバリデーションエラー後にこういうURLの変化を取っている以上、何か理由がある気がしています(ググってもわからず)。
どなたか解決策や普段どのように対処なさっているのか、ご教示いただける方がいらっしゃいましたら幸いです。
素人質問で恐縮です。
よろしくお願いいたします。