我有一个单数资源和一个复数控制器:路由文件中的 PeopleController 和资源:人。在我的控制器创建操作中,我有一个 redirect_to @person,它应该重定向到刚刚创建的人员对象的显示操作。在我的控制器测试中,我断言 response.should redirect_to(@person)。这对我来说似乎很简单,但是当我运行规范时,我收到了这个错误:
Failure/Error: post :create
NoMethodError:
undefined method `people_url' for #<PeopleController:0x00000002d7d988>
似乎创建操作中的重定向正在尝试转到索引操作,对于单一资源,该操作不(也不应该)存在。
路由表很简单:
person POST /person(.:format) people#create
new_person GET /person/new(.:format) people#new
edit_person GET /person/edit(.:format) people#edit
GET /person(.:format) people#show
PUT /person(.:format) people#update
DELETE /person(.:format) people#destroy
我明白为什么我会收到未定义的方法错误:单一资源没有 people_url,只有 person_url。我对为什么 redirect_to @person 试图调用 people_url 开始感到困惑。它不应该默认使用名为 person_url 的路由,并传递新保存的 person 对象的 id 吗?我可以通过使用redirect_to person_path(@person) 来通过测试,但是为什么这与redirect_to @person 应该返回的不同呢?
从辅助方法中的命名路由检查构造的 URL 的最佳方法是什么?当然,除了编写失败的测试。我已经很擅长了:-)。