Rails — сбит с толку изменением URL-адреса при сбое проверки модели

#ruby-on-rails

#ruby-on-rails

Вопрос:

У меня есть пользовательский ресурс, где :name является обязательным атрибутом модели.

Если я попытаюсь создать нового пользователя без имени, проверка завершится неудачно, и сообщения об ошибках будут отображаться в верхней части формы, как и ожидалось, но URL-адрес страницы изменится с /users/new , на /users ?

Я не замечал такого поведения до сегодняшнего вечера, когда впервые начал играть с capybara и ожидал, что current_path после сбоя проверки будет http://localhost:3000/users/new

Я не мог понять, почему моя спецификация не удалась:

 it 'should not create an invalid user' do
  fill_in "Name", :with=>""
  click_button "Create User"
  current_path.should == new_users_path
end
  

Я проверил, что это происходит во всех других моих приложениях rails, поэтому я понимаю, что так работает rails, но я действительно не понимаю, что здесь происходит. Почему это так работает? Почему путь меняется с new_users_path на на users_path при сбое проверки?

Это меня очень смутило

Комментарии:

1. Как выглядит код вашего контроллера для этих действий?

Ответ №1:

Это совершенно нормально.

В базовом CRUD вы создаете своих пользователей, используя POST запрос на /users .

Если проверка завершается неудачно, вы просто отображаете edit представление, но URL-адрес не изменяется.

Чтобы изменить URL-адрес, вы должны redirect_to , но таким образом вы потеряете информацию, связанную с выполненной проверкой.

Комментарии:

1. ах, теперь я понял. Спасибо, это объясняет

2. ИМХО, это тот случай, когда любовь Rails к CRUD превзошла удобство использования. Помимо изменения URL-адреса, что, если пользователь обновит страницу после ошибки проверки? Ошибка маршрутизации, потому что вы получаете /users вместо /users/new . Но, тем не менее, полезно знать, что это общепринятое соглашение (даже если известные магазины rails, такие как square, не следуют ему: попробуйте вызвать ошибку проверки здесь squareup.com/login )

3. Я должен уточнить, что обновление после ошибки проверки приведет к отображению индексного представления. но все еще сбивает с толку — URL-адрес для отображения ошибок при проверке должен совпадать с URL-адресом для заполнения формы — или, по крайней мере, я считаю, что это обеспечит лучший пользовательский интерфейс.

4. @KarlRosaen: просто адаптируйте свои маршруты

5. Да, просто указываю, что рекомендуемый по умолчанию подход, используемый направляющими rails, и то, что создается с помощью «rails generate scaffold», как указывает исходный вопрос, сбивает с толку проверку формы.