Rails:将几个嵌套路由指向一个客户控制器操作

时间:2012-07-02 02:50:31

标签: ruby-on-rails routes polymorphic-associations

如何将不同的嵌套路由指向一个控制器操作?

用户可以是公司,项目,组等多个组的成员。它可以请求加入,离开或被管理员删除。

我想访问多个模型的删除操作并销毁配置文件模型中的belongs_to记录

我已经有了一个多态模型,可以将配置文件中的请求发送到模型(例如公司),并且在接受请求后,配置文件将属于模型。一旦请求被接受,则被销毁的请求将被销毁。我觉得将破坏配置文件和模型之间关系的删除操作应该是requests_controller的一部分,但我想可能是profile_controller的一部分。

我想我最终需要的是

/_model_/:id/profile/:id/remove
/company/:id/profile/:id/remove

但是如何在请求控制器中指出删除操作

/_model_/:id/requests/remove
/company/:id/request/remove

我在路线中使用以下代码

resources :companies do
   resource :requests do
     put 'remove', :on => :member 
   end
   resources :requests do
      put 'accept', :on => :member
   end
 end

这产生了路线的双倍

remove_company_requests PUT    /companies/:company_id/requests/remove(.:format)     
       company_requests POST   /companies/:company_id/requests(.:format)            
   new_company_requests GET    /companies/:company_id/requests/new(.:format)        
  edit_company_requests GET    /companies/:company_id/requests/edit(.:format)       
                        GET    /companies/:company_id/requests(.:format)            
                        PUT    /companies/:company_id/requests(.:format)            
                        DELETE /companies/:company_id/requests(.:format)            
 accept_company_request PUT    /companies/:company_id/requests/:id/accept(.:format) 
                        GET    /companies/:company_id/requests(.:format)            
                        POST   /companies/:company_id/requests(.:format)            
    new_company_request GET    /companies/:company_id/requests/new(.:format)       
   edit_company_request GET    /companies/:company_id/requests/:id/edit(.:format)   
        company_request GET    /companies/:company_id/requests/:id(.:format)        
                        PUT    /companies/:company_id/requests/:id(.:format)        
                        DELETE /companies/:company_id/requests/:id(.:format)   

作为

2 个答案:

答案 0 :(得分:1)

我建议你创建一个新的控制器来处理这个问题?优点是您可以在任何想要“删除关联”的模型上将路径映射到此控制器。

例如:

# RemoveController.rb
class RemoveController < ApplicationController
  def destroy
     # inplement the logic for deletion. You can use refection to implement 
     # this function only once for all the applied associations.    
  end
end

# routes.rb
resources :companies do
  resource :requests do
    resource :remove, :controller => :remove, :only => [:destroy]
  end
end

以上路线会产生:

company_requests_remove DELETE /companies/:company_id/requests/remove(.:format)          remove#destroy

你可以在你想要的任何嵌套路由上嵌入remove控制器的上面一行,它们都将指向RemoteController的destroy对象,只有不同的参数可以帮助你实现destroy动作。

编辑:要为您不想复制的特定关系添加创建,您可以执行以下操作:

# routes.rb
resources :companies do
  resource :requests do
    resource :remove, :controller => :relationship, :only => [:destroy]
    resource :create, :controller => :relationship, :only => [:create]
  end
end

company_requests_remove DELETE /companies/:company_id/requests/remove(.:format)        relationship#destroy
company_requests_create POST   /companies/:company_id/requests/create(.:format)        relationship#create

但我认为您可能需要小心在相应的控制器中打破create的约定。我不确定这是否有任何不利因素。删除部分只是删除关联而不是记录本身,它似乎没有违反惯例。

答案 1 :(得分:0)

尝试

puts 'remove', :on => :member, :controller => :requests, :action => :remove