【问题标题】:Rails routes: namespace + resource + collection vs matchRails 路由:命名空间 + 资源 + 集合 vs 匹配
【发布时间】:2014-11-24 03:33:55
【问题描述】:

使用命名空间 + 资源 + 集合与使用匹配有何不同。

例如,假设我想处理某个端点的所有 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

除了行数之外,还有什么理由让我更喜欢一种方式而不是另一种方式?

【问题讨论】:

    标签: ruby-on-rails rails-routing


    【解决方案1】:

    在这种情况下match 是最好的解决方案。资源配置应该主要用于定义安静的路由(加上一些特殊的其他路由),正如关键字已经说过的,这意味着有一些资源作为端点。 例如,您使用 Session#create 而不是 AuhtService.perfom_sing_in(将 Session 作为 restful 资源而不是对服务执行 rpc 调用)

    在您的情况下,您的路由中根本没有任何 REST 语义,所以匹配就好了

    【讨论】:

    • answers for this question 提出,RESTful 路由是 HTTP 方法 + URL 的组合,以达到不同的结果。如果是这样的话,我认为上面的两个例子都很平静。但是假设端点上有一个资源,例如match '/api/library/book', to: 'api/library#book', via: :all 允许您执行诸如创建书籍、更新书籍和删除书籍之类的操作(如果您使用适当的 HTTP 方法,否则您会收到 405 响应)。现在使用resources 方法更好吗?
    • 在这种情况下,我认为这两种方式都没有错。将 ressources dsl 用于 non-restfull 路由有点麻烦,因为完全匹配,但是 match 是一个简单的构建块,如果你可以更优雅地定义它们,将它用于 restfull 路由并没有错。但也有人可能会争辩说,在这种情况下使用 ressource dsl 更明确,因此是一个自我记录的代码,表明你有一个 resfull 资源
    • 好点。与 match one-liner 相比,我认为资源 DSL 肯定更明确,并使您的意图更加明确。如果您不支持某些 HTTP 方法,那么当您使用资源 DSL 时,您可以在该动词旁边添加一个内联注释(例如 #405)。
    猜你喜欢
    • 1970-01-01
    • 2012-05-04
    • 1970-01-01
    • 1970-01-01
    • 2011-05-25
    • 1970-01-01
    • 1970-01-01
    • 2023-03-16
    • 1970-01-01
    相关资源
    最近更新 更多