Rails用于不同控制器操作的相同路由(POST /用户)[设计]

时间:2016-11-13 17:16:27

标签: ruby-on-rails ruby curl devise ruby-on-rails-5

我有一个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

1 个答案:

答案 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
...