我有一个rails api应用程序,我使用Devise gem进行用户管理。我在设计宝石上创建了一个用户模型。之后,我注意到rake routes
命令中列出了两条相同的路由。我希望POST (/users)
先调用api/v1/users#create
操作,然后调用devise/registrations#create
。
user_registration POST /users(.:format) devise/registrations#create
api_users POST /users(.:format) api/v1/users#create {:format=>:json}
当我使用users_controller_spec文件测试POST (/users)
时,会调用api/v1/users#create
操作。但是,当我使用POSTMAN执行POST (/users)
时,日志表明会调用devise/registrations#create
操作。
如何更正此问题,以便我POST (/users)
首先使用POSTMAN或curl调用api/v1/users#create
来创建用户模型,然后调用devise/registrations#create
来注册用户?
我不是100%确定设计是如何工作的,所以这里的任何帮助都会有所帮助。
这是我的config/routes.rb
Rails.application.routes.draw do
devise_for :users
# Api definition
namespace :api, defaults: { format: :json }, path: '/' do
scope module: :v1, constraints: ApiConstraints.new(version: 1, default: true) do
# We are going to list our resources here
resources :users, only: [:show, :create, :update, :destroy]
resources :sessions, only: [:create, :destroy]
end
end
end
答案 0 :(得分:1)
因此,使用Rails Routes时,当您发出请求时,会检查路由,因为它们是从routes.rb
从上到下定义的。
现在,当您通过POSTMAN
发出请求时,/users
路径与通过devise_for
生成的路径匹配,因为它是文件中的第一行。
现在,当您为控制器编写测试时,您实际上并没有访问/users
,而只是告诉api/v1/users_controller
调用create
方法,该方法必然会被命中api/v1/users#create
现在,您可以通过更改devise
命名其路由的方法来解决此冲突。如果您这样做:
Rails.application.routes.draw do
devise_for :users, path: 'customer'
# Api definition
namespace :api, defaults: { format: :json }, path: '/' do
scope module: :v1, constraints: ApiConstraints.new(version: 1, default: true) do
# We are going to list our resources here
resources :users, only: [:show, :create, :update, :destroy]
resources :sessions, only: [:create, :destroy]
end
end
end
这就是设计路线:
new_user_session GET /customer/sign_in(.:format) devise/sessions#new
user_session POST /customer/sign_in(.:format) devise/sessions#create
destroy_user_session DELETE /customer/sign_out(.:format) devise/sessions#destroy
user_password POST /customer/password(.:format) devise/passwords#create
new_user_password GET /customer/password/new(.:format) devise/passwords#new
edit_user_password GET /customer/password/edit(.:format) devise/passwords#edit
...