#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», как указывает исходный вопрос, сбивает с толку проверку формы.