我是否应该对非CRUD路由(Rails)使用资源路由?

时间:2019-05-28 07:46:20

标签: ruby-on-rails routing routes

即使CRUD动词与所执行的动作与实际操作不完全一样,是否仍尽可能在Rails中使用resourceful routes被认为是最佳实践?

在我的Rails应用程序中,我正在使用sorceryexternal模块来实现OAuth登录系统。我密切关注了他们的官方tutorial,该官方{{3}}定义了此类OAuth方法的路由。

# config/routes.rb
post "oauth/callback" => "oauths#callback"
get "oauth/callback" => "oauths#callback" # for use with Github, Facebook
get "oauth/:provider" => "oauths#oauth", :as => :auth_at_provider

基本上,当用户单击“通过[提供者名称]登录”按钮时,将调用auth_at_provider,并且在用户通过外部提供者登录后将调用callback

我按原样保留了路线,但是一位队友对其进行了审核,建议我们使用资源路线,例如:

resources :oauth only: [:index, :create, :show]

我认为这在技术上是可行的,但是对我而言,本教程中定义的单条路线更加直观和不言自明。所以我的问题是:

  • 即使在这种情况下,使用资源丰富的路由是否被认为更好(或更常见)?或
  • 资源丰富的路由是否只是cookie切割器路由的简写,并且仅应用于简单的控制器?

2 个答案:

答案 0 :(得分:1)

当您实际上在资源上执行CRUD时,通常被认为是使用资源路由的最佳实践,即:

resources :users # for creating, reading, updating, deleting users

例如,如果您只需要为一个创建端点创建一个全新的资源和控制器,那么在破坏模式和使用非资源路由时,我看不出任何危害,但是我尽量避免这样做这样。

您应该尝试使用名称有意义的资源丰富的路由,以使路由保持一致:

scope path: 'oauth' do
  resource :callback, only: [:show, :update] # use show/update instead of callback method
  resources :providers, only: [:show] # use show instead of auth_at_provider
end

所以您的路线如下:

POST oauth/callback
GET  oauth/callback
GET  oauth/providers/:id

答案 1 :(得分:1)

我不会使用资源助手。名称告诉您它用于资源,而oauth逻辑不是资源。

您可以稍微重构一下路线

namespace :oauth do
  match :callback, via: [:get, :post]
  get ":provider", action: :oauth, as: :at_provider
end

这将创建以下路线:

              oauth_callback GET|POST /oauth/callback(.:format)                                                                oauth#callback
           oauth_at_provider GET      /oauth/:provider(.:format)                                                               oauth#oauth

DRYer基本上是相同的路线,并且不会误导“资源”字眼。

*请注意,名称空间将“ auth_at_provider”更改为“ o auth_at_provider”