如何将不同的嵌套路由指向一个控制器操作?
用户可以是公司,项目,组等多个组的成员。它可以请求加入,离开或被管理员删除。
我想访问多个模型的删除操作并销毁配置文件模型中的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)
作为
答案 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