1

我有一个单数资源和一个复数控制器:路由文件中的 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 的最佳方法是什么?当然,除了编写失败的测试。我已经很擅长了:-)。

4

0 回答 0