0

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

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

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

我已经有一个多态模型,该模型将请求从配置文件发送到模型(例如公司),并且在接受请求后,配置文件将属于该模型。一旦请求被接受,记录的请求就会被销毁。我觉得会破坏profile和model关系的remove动作应该是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)   

作为

4

2 回答 2

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

您可以将删除控制器的上述行嵌套在您想要的任何嵌套路由上,它们都将指向 RemoteController 的销毁对象,仅使用不同的参数来帮助您实现销毁操作。

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

# 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

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

于 2012-07-02T07:04:03.410 回答
0

尝试

puts 'remove', :on => :member, :controller => :requests, :action => :remove
于 2012-07-02T03:52:38.210 回答