2014-09-29 4 views
1

Как использовать пространство имен + ресурс + коллекция по сравнению с использованием совпадения.Rails routes: namespace + resource + collection vs match

Например, я хочу обрабатывать все HTTP-методы для некоторой конечной точки.

namespace :webhooks do 
    resources :some_service, only: :none do 
    collection do 
     get :some_action 
     post :some_action 
     put :some_action 
     patch :some_action 
     delete :some_action 
    end 
    end 
end 

# Compare to 

match '/webhooks/some_service/some_action', to: 'webhooks/some_service#some_action', via: :all 

Вот связанные маршруты в соответствии с rake routes:

        Prefix Verb  URI Pattern          Controller#Action 

some_action_webhooks_some_service_index GET  /webhooks/some_service/some_action(.:format)  webhooks/some_service#some_action 
             POST  /webhooks/some_service/some_action(.:format)  webhooks/some_service#some_action 
             PUT  /webhooks/some_service/some_action(.:format)  webhooks/some_service#some_action 
             PATCH /webhooks/some_service/some_action(.:format)  webhooks/some_service#some_action 
             DELETE /webhooks/some_service/some_action(.:format)  webhooks/some_service#some_action 
     webhooks_some_service_some_action   /webhooks/some_service/some_action(.:format)  webhooks/some_service#some_action 

Кроме подсчета линии, есть причины, почему я должен предпочесть одну сторону по сравнению с другими?

ответ

1

В этом случае match - лучшее решение. Конфигурация ресурсов должна использоваться первично для определения спокойных маршрутов (плюс некоторые исключительные другие маршруты), которые, как уже сказано в ключевом ключе, подразумевают наличие некоторого ресурса в качестве конечной точки. Например, вы используете Session#create вместо AuhtService.perfom_sing_in (с сессией в качестве успокоительных ресурсов вместо выполнении RPC вызов службы)

В вашем случае вы не имея какую-либо REST семантики в маршрутах на всех, так что матч просто fine

+0

[ответы на этот вопрос] (http://stackoverflow.com/questions/2441962/what-is-restful-routing) показывают, что спокойная маршрутизация представляет собой комбинацию методов HTTP + URL для достижения разных результатов. Если это так, я думаю, что оба приведенных выше примера успокаиваются. Но предположим, что есть ресурс в конечной точке, например. 'match '/ api/library/book', to: 'api/library # book', через:: all', который позволяет вам делать такие вещи, как создание книги, обновление книги и удаление книги (если вы используете соответствующий HTTP-метод, иначе вы получите ответ 405). Является ли метод «ресурсов» лучше использовать сейчас? – Dennis

+1

В этом случае я не вижу ничего плохого в обоих направлениях. Немного громоздко использовать ressources dsl для не-restfull маршрутов, потому что для этого точно подходит матч, однако 'match' - это простой строительный блок, и нет ничего плохого в использовании его для restfull-маршрутов, если вы можете определить их более элегантно. Но кто-то может также утверждать, что использование ressource dsl в этом случае более явственно и, следовательно, является самодокументированным кодом, указывающим, что у вас есть resfull ressouce –

+0

Хорошая точка. Я думаю, что ресурсы DSL определенно более ясны и делают ваши намерения ясными, по сравнению с однострочным совпадением. И если вы не поддерживаете определенные HTTP-методы, вы можете сказать это с помощью встроенного комментария рядом с этим глаголом (например, # 405), когда вы используете ресурсы DSL. – Dennis