2012-07-02 5 views
0

Как вы указываете разные вложенные маршруты на одно действие контроллера?Rails: укажите несколько вложенных маршрутов на одно действие контроллера клиента

Пользователь может быть членом нескольких групп, таких как компания, проект, групповой ect. для которого он может запросить присоединение, оставить или удалить администратором.

Я хочу получить доступ действия вынимается для нескольких моделей и уничтожить запись belongs_to в модели профиля

У меня уже есть полиморфная модель, которая принимает запросы от профиля к модели (например, компаниям) в и на прием запроса профиль будет принадлежать модели . после того, как запрос будет принят, восстановленный запрос уничтожается. Я чувствую, что действие удаления, которое разрушит взаимосвязь между профилем и моделью , должно быть частью request_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) 

Как

ответ

1

My Я предлагаю вам создать новый контроллер для обработки этого? Преимущество состоит в том, что вы можете сопоставить маршрут с этим контроллером на любых моделях, на которые вы хотите «удалить ассоциацию».

Например:

# 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, только с различными параметрами, которые помогут вам выполнить действие destroy.

Edit: добавить создать для конкретных отношений, которые вы не хотите дублировать вы можете сделать это:

# 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 

Но я думаю, что вам, возможно, придется быть осторожными о нарушении конвенции о создании в соответствующем контроллер. Я не уверен, есть ли недостатки в этом. Убрать часть с момента удаления только ассоциации, а не самих записей, она, похоже, не нарушает соглашение.

+0

Что было бы связано с растягиванием этого на Contoller отношений, так что пользовательское действие accept (create), которое у меня есть в моем контроллере запросов, становится действием create –

+0

К сожалению, я не совсем следовал вашему вопросу выше. Вы можете немного пояснить? Благодаря! – yuklai

+0

Собственно, если я правильно понимаю, позвольте мне изменить решение выше и посмотреть, отвечает ли это на ваш вопрос. – yuklai

0

Попробуйте

puts 'remove', :on => :member, :controller => :requests, :action => :remove 
Смежные вопросы