Rails - 当模型验证失败时被 URL 更改混淆

ste*_*och 5 ruby-on-rails

我有一个用户资源,其中:name是模型上的必需属性。

如果我尝试创建一个没有名称的新用户,则验证失败并且错误消息按预期显示在表单顶部,页面的 URL 从/users/new, 变为/users?

直到今晚我第一次开始玩水豚时,我才注意到这种行为,并期望验证失败后的 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
Run Code Online (Sandbox Code Playgroud)

我已经验证它发生在我所有的其他 rails 应用程序中,所以我意识到这就是 rails 的工作方式,但我真的不明白这里发生了什么。为什么它会这样工作?为什么验证失败时路径会从new_users_path变为users_path

这让我非常困惑

apn*_*ing 3

这是完全正常的。

在基本的 CRUD 中,您使用 的POST请求来创建用户/users

如果验证失败,您只需渲染edit视图,但不会更改 url。

要更改 url,您应该redirect_to这样做,但是这样您就会丢失与执行的验证相关的信息。

  • 恕我直言,这是 Rails 对 CRUD 的热爱超过了可用性的情况。除了 url 更改之外,如果用户在验证错误后刷新页面怎么办?路由错误,因为您是从 /users 而不是 /users/new 获取的。但很高兴知道这仍然是公认的约定(即使像 square 这样的知名 Rails 商店不遵循它:尝试在此处强制验证错误 https://squareup.com/login) (8认同)