

初めて質問させていただきます。ちょっと質問が長いのですが出来る限り噛み砕くのでお詳しい方ご教示頂けましたら幸いです。

当方の環境ではRailsで新規投稿をするとき、バリデーションに引っかかった際には、URLは以下のように変化します。

ttp://localhost:3000/posts/new  
↓↓↓  
ttp://localhost:3000/posts

必要ないかもしれませんが、Controller側はこんな感じを想定。

[code]

    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
    
[/code]

URLは気になりますが、この際、バリデーションに引っかかった時点ではフォームの中身も保持されており、URLさえ気にしなければ問題ないと思っています。

ただし、ブラウザボタンで１度戻って（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アクションを以下のように書けば一応フォームは出現させられますが、フォームの内容は消えますしなんだか強引な気がしています。

[code]

    def index
      @post = Post.new
      @post.build
      render action: :new
    end
    
[/code]

Railsユーザーの皆様はこのような自体をどのように処理しているのでしょうか？

スマートな解決策としては  
・バリデーションエラー後にもURLを変化させない（/post/newのまま）  
というのが１番手っ取り早い気がするのですがやり方がわからないのと、Railsがバリデーションエラー後にこういうURLの変化を取っている以上、何か理由がある気がしています（ググってもわからず）。

どなたか解決策や普段どのように対処なさっているのか、ご教示いただける方がいらっしゃいましたら幸いです。

素人質問で恐縮です。  
よろしくお願いいたします。


CC BY-SA 3.0
2017-07-30T17:48:24.557
36794
2023-06-27T11:07:06.033
24655
question
ruby-on-rails ruby
newアクションのバリデーションエラー後のURLの挙動とそれに伴うエラーについて


同じ件にひっかかってました…。  
力技かもしれませんが、javascriptでむりくりURLかえることにしました。  
（もっと他に良い方法あるような…。）

_form.html.erb

[code]

    <% if post.errors.any? %>
    <script type="text/javascript">
    $(document).ready(function() {
      history.pushState('', '', location.href + '/new')
    });
    </script>
    <% end %>
    
[/code]


CC BY-SA 3.0
2017-09-09T23:05:09.787
37841
2017-09-09T23:05:09.787
25307
36794
answer