簡體   English   中英

Rails:將多條嵌套路線指向一個客戶控制器操作

[英]Rails: Point several nested routes to one customer controller action

如何將不同的嵌套路由指向一個控制器動作?

用戶可以是公司,項目,組等多個組的成員。 為此,它可以請求加入,離開或被管理員刪除。

我想訪問幾個模型的remove動作並銷毀個人檔案模型中的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)   

我我建議您創建一個新的控制器來處理此問題? 好處是您可以在要“刪除關聯”的任何模型上映射到該控制器的路由。

例如:

# 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約定。 我不確定這是否有不利之處。 因為除去部分僅除去關聯而不是記錄本身,所以它似乎沒有違反約定。

嘗試

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM