即使CRUD动词与所执行的动作与实际操作不完全一样,是否仍尽可能在Rails中使用resourceful routes被认为是最佳实践?
在我的Rails应用程序中,我正在使用sorcery
的external
模块来实现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]
我认为这在技术上是可行的,但是对我而言,本教程中定义的单条路线更加直观和不言自明。所以我的问题是:
答案 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”