Techioz Blog

ユーザーがエラーを修正するためにフォームに戻ったときに、ブラウザ バーの URL が変更されないようにするにはどうすればよいですか?

概要

Rails 5 を使用しています。ユーザーが自分のプロフィールを更新できるページがあり、何か問題が発生した場合はそのページに戻されます。

  def update
    @user = current_user
    if @user.update_attributes(user_params)
      …
      redirect_to url_for(:controller => ‘main’, :action => 'index') and return
    end

    render 'edit'
  end

問題は、元のページに戻ると、ブラウザ バーの URL が「http://localhost:3000/users/51」と表示され、これが訪問していた元の URL (つまり「http:」) ではないことです。 //localhost:3000/users/edit”)。 URL を以前と同じ状態に保つにはどうすればよいですか?

編集:これは、rakeルートを実行すると生成されるものです

           edit_users GET    /users/edit(.:format)                      users#edit
                users GET    /users(.:format)                           users#index
                      POST   /users(.:format)                           users#create
             new_user GET    /users/new(.:format)                       users#new
            edit_user GET    /users/:id/edit(.:format)                  users#edit
                 user GET    /users/:id(.:format)                       users#show
                      PATCH  /users/:id(.:format)                       users#update
                      PUT    /users/:id(.:format)                       users#update
                      DELETE /users/:id(.:format)                       users#destroy

解決策

あなたの仮定は正しくないと思います。ユーザーがエラーを修正するためにフォームに戻ったときに、ブラウザ バーの URL が変更されないようにするにはどうすればよいですか?

その答えは、ユーザーがエラーを修正するためにフォームを再度表示しても、ブラウザーの URL は変更されないということです。初めてフォームを送信した時点で URL が変更されていたためです。

一般的な規則に従う Routes.rb を使用すると、次のルートが得られます (それらをリストするには、rails ルートを使用します)。

GET    /users(.:format)          users#index
POST   /users(.:format)          users#create
GET    /users/new(.:format)      users#new
GET    /users/:id/edit(.:format) users#edit
GET    /users/:id(.:format)      users#show
PATCH  /users/:id(.:format)      users#update
PUT    /users/:id(.:format)      users#update
DELETE /users/:id(.:format)      users#destroy

/users/:id/edit に対して GET リクエストを実行すると、ユーザー更新フォームが表示されます。ただし、そのフォームからの実際の更新リクエストは PATCH /users/:id にポストされます。つまり、ブラウザはすでに別の URL を使用しています。

update メソッド内 (すでに URL /users/:id にあることに注意してください) には、基本的に 2 つのオプションしかありません。

私見ですが、あなたの質問に対する答えは次のとおりです。Rails によって選択されたパスを離れ、まったく異なるルート、コントローラー、フォームのセットアップを構築しない限り、やりたいことはできません。 GET リクエストと PATCH (または POST) リクエストに対して同じルートを設定する必要があります。そして、コントローラー メソッドは、両方のタイプのリクエストを異なる方法で処理できる必要がありました。 Rails 2.0 以降、リソースルーティングが推奨される方法です。欲しいものはRails 2.0以前は一般的だった

私のアドバイスは、Rails の規約に従うことです。 URL は重要ではありません。誰も気にしません。フォームに別の URL を設定するためだけに Rails の規則に従わないことにメリットはありません。