【问题标题】:Rails same route (POST /users) for different controller actions [Devise]Rails 为不同的控制器操作提供相同的路由(POST /users)[设计]
【发布时间】:2016-11-13 17:16:26
【问题描述】:

我有一个 Rails api 应用程序,我在其中使用 Devise gem 进行用户管理。我在设计 gem 上创建了一个用户模型。之后,我注意到rake routescommand 中列出了两条相同的路线。我希望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#createaction。

如何更正此问题,以便我使用 POSTMAN 或 curl 执行的 POST (/users) 首先调用 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

【问题讨论】:

  • 请您发布您的 config/routes.rb 文件好吗?
  • 请提供您的 rails 版本,也只是想知道您对这种方法的请求类型,例如 json、html 等,请同时发布您的路线文件@millin
  • 我在做 json 请求,因为我可以创建一个 API @ManojMenon
  • @EddeAlmeida 我已经更新了问题并包括了我的config/routes.rb
  • 您已经添加了两次用户资源。 devise_for :用户和资源:用户,仅:[:show,:create,:update,:destroy]

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


【解决方案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
...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-01-12
    • 1970-01-01
    • 1970-01-01
    • 2013-09-24
    • 2016-03-29
    • 1970-01-01
    • 1970-01-01
    • 2017-04-05
    相关资源
    最近更新 更多