2016-11-13 250 views
1

我有一个rails API应用程序,我用Devise gem进行用户管理。我从设计宝石创建了一个用户模型。之后,我注意到在rake routes命令中列出了两条相同的路由。我想POST (/users)先致电api/v1/users#create行动,然后致电devise/registrations#createRails相同的路线(POST /用户)为不同的控制器操作[设计]

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

请您发表您的**'配置/ routes.rb' **文件? –

+0

您的rails版本请,也只是想知道什么类型的请求你打这个方法,例如json,html等,请张贴您的路由文件也@millin –

+0

我正在做json请求,因为我可以创建一个API @ ManojMenon –

回答

1

因此,使用Rails路由的事情是,当你的请求,路由,因为它们是在routes.rb定义从上到下检查。

现在,当您通过POSTMAN发出请求时,/users路径与通过devise_for生成的路径相匹配,因为它是文件中的第一行。

现在,当你正在编写控制器的测试,你是不是真的访问/users,你只是告诉api/v1/users_controller调用create方法,这势必会击中api/v1/users#create

现在,这样你可以解决这个冲突是通过改变什么来命名它的路由。如果你做这样的事情:

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 
... 
相关问题