Я считаю, что ваше предположение не является правильным. Вы спрашиваете Как предотвратить изменение URL-адреса в строке браузера, когда пользователь возвращается в форму для исправления ошибок?
И ответ: URL-адрес браузера не изменяется, когда пользователь снова видит форму для исправления ошибок. Поскольку URL-адрес уже был изменен, когда форма была отправлена в первый раз.
С помощью routes.rb
следующих общих конвенций ваш будет иметь следующие маршруты (используйте rails routes
перечислить их): обновление формы
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
Пользователь визуализируется, когда вы делаете GET
запрос /users/:id/edit
. Но фактический запрос на обновление из этой формы отправляется на PATCH /users/:id
. Это означает, что браузер использует уже другой URL-адрес.
В методе update
(помните, что это уже в URL /users/:id
) Вы в основном есть только два варианта:
- рендера что-то. Рендеринг представления в действии сохраняет URL одинаковым (он все равно будет
/users/:id
), но у вас есть изменение на использование пользователя, назначенного для @user
, например, чтобы показать его ошибки в форме. Это поведение по умолчанию Rails при сбое обновления.
- Вы можете перенаправить браузер на другой URL (например, обратно на
/users/:id/edit
или на совершенно другой URL-адрес, например на домашнюю страницу). Это изменяет URL-адрес в адресной строке браузера. Но перенаправление всегда делает новый запрос GET
, что означает, что вы теряете информацию, отправляемую через post
, и вы потеряете экземпляр User
, назначенный в настоящее время для @user
. После GET
пользователь перезагружается из базы данных и поэтому не имеет назначенных ошибок. В Rails перенаправление используется, когда обновление было успешным, чтобы предотвратить другой POST
, если пользователь нажимает кнопку перезагрузки в браузере.
IMHO Ответ на ваш вопрос: вы не можете делать то, что хотите, не покидая путь, выбранный Rails, и создаете совершенно другой маршрут, контроллер и форму. Вам нужно будет настроить маршрут, который будет одинаковым для запросов GET
и PATCH
(или POST
). И метод контроллера должен иметь возможность обрабатывать оба типа запросов по-разному. Поскольку маршрутизация ресурсов Rails 2.0 является предпочтительным способом. То, что вы хотите, было распространено до Rails 2.0
Мой совет: Следуйте соглашениям Rails. URL-адрес не важен, никто не заботится. Я не вижу преимуществ в том, чтобы не следовать правилам Rails только для того, чтобы иметь другой URL для формы.
'и return' - это плохая привычка, так как нет никакой гарантии, что такие вещи, как метод redirect_to, возвращают логически истинное значение. Гораздо лучше сделать 'return redirect_to ...', поэтому нет никаких шансов, что это не удастся. – tadman
Обычно я рекомендую делать '@ user.update_attributes!' И перенаправлять. Если возникнет проблема с обновлением, вы получите ошибку «ActiveRecord :: RecordInvalid», которую вы можете спасти и обработать с помощью «render (action: 'edit')». – tadman
Я не понимаю, на какой ответ я прочитал ваши комментарии. Выполнение явно переходит к строке «render» edit », потому что в модели есть ошибка, но URL-адрес на результирующей странице не совпадает с предыдущим. –