在rails 3.2资源中定义为“member”时,自定义路由不起作用

时间:2014-11-17 22:26:29

标签: ruby-on-rails-3 routes custom-routes

我们需要在rails 3.2 app中定义4个自定义操作。这4个操作负责创建和编辑客户登录。在routes.rb中,这里添加了routes.rb:

member do
  get :new_customer_login
  put :create_customer_login
  get :edit_customer_login
  put :update_customer_login   
end

rake routes显示正确的路线:

 new_customer_login_user GET    /users/:id/new_customer_login(.:format)        authentify/users#new_customer_login
create_customer_login_user PUT    /users/:id/create_customer_login(.:format)     authentify/users#create_customer_login
   edit_cutomer_login_user GET    /users/:id/edit_cutomer_login(.:format)        authentify/users#edit_cutomer_login
update_customer_login_user PUT    /users/:id/update_customer_login(.:format)     authentify/users#update_customer_login

然而,当我们启动规范并且没有路由错误时:

No route matches {:action=>"new_customer_login", :controller=>"authentify/users"}

我们所做的是将routes.rb中的member更改为collection

collection do
  get :new_customer_login
  put :create_customer_login
  get :edit_customer_login
  put :update_customer_login   
end

令人惊讶的是,no route错误消失了,调试成功定义了new_customer_login。我们不清楚为什么collection而不是member路由起作用。这4个动作真正在单个记录上工作。有人可以提供推理,为什么收集但不是成员在这里工作以及如何解决?

1 个答案:

答案 0 :(得分:0)

No route matches {:action=>"new_customer_login", :controller=>"authentify/users"}

此消息实际上表明构建URL的参数不足(缺少id)。

成员操作应该路由到单个记录和集合路由到记录集合。这就是成员操作的路径助手期望接收模型对象或id作为参数的原因。

您应该在规范中致电new_customer_login_user(user) user是用户对象。

您似乎也在定义标准CRUD操作,而CustomerLogin是项目中的资源。在这种情况下,请考虑使用嵌套资源,以便rails自动生成它们。请参阅http://guides.rubyonrails.org/routing.html#nested-resources

上的文档