定制设计路线

Mic*_*rey 5 ruby api routes ruby-on-rails devise

Using devise (3.2.2)
Using rails (4.0.2)
Run Code Online (Sandbox Code Playgroud)

致力于开发仅需要某些路由的API。我的内容如下routes.rb

devise_for :users, path: '/users', controllers: {
  sessions: 'v1/custom_devise/sessions',
  passwords: 'v1/custom_devise/passwords'
}
Run Code Online (Sandbox Code Playgroud)

大!现在我们有了所有这些路线:

              Prefix Verb    URI Pattern                    Controller#Action
    new_user_session GET     /users/sign_in(.:format)       v1/custom_devise/sessions#new
        user_session POST    /users/sign_in(.:format)       v1/custom_devise/sessions#create
destroy_user_session DELETE  /users/sign_out(.:format)      v1/custom_devise/sessions#destroy
       user_password POST    /users/password(.:format)      v1/custom_devise/passwords#create
   new_user_password GET     /users/password/new(.:format)  v1/custom_devise/passwords#new
  edit_user_password GET     /users/password/edit(.:format) v1/custom_devise/passwords#edit
                     PATCH   /users/password(.:format)      v1/custom_devise/passwords#update
                     PUT     /users/password(.:format)      v1/custom_devise/passwords#update
Run Code Online (Sandbox Code Playgroud)

但是我不需要或不需要这些路线:

    new_user_session GET     /users/sign_in(.:format)       v1/custom_devise/sessions#new
   new_user_password GET     /users/password/new(.:format)  v1/custom_devise/passwords#new
  edit_user_password GET     /users/password/edit(.:format) v1/custom_devise/passwords#edit
Run Code Online (Sandbox Code Playgroud)

所以我想我将按照文档创建自己的路线。所以我改变了我的routes.rb

devise_scope :user do
  post   '/users/sign_in'  => 'custom_devise/sessions#create',  as: :user_session
  delete '/users/sign_out' => 'custom_devise/sessions#destroy', as: :destroy_user_session

  post  '/users/password'  => 'custom_devise/passwords#create', as: :user_password
  put   '/users/password'  => 'custom_devise/passwords#update', as: nil
  patch '/users/password'  => 'custom_devise/passwords#update', as: nil
end
Run Code Online (Sandbox Code Playgroud)

现在我的路线看起来很完美,就像我想要的那样:

              Prefix Verb    URI Pattern                   Controller#Action
        user_session POST    /users/sign_in(.:format)      v1/custom_devise/sessions#create
destroy_user_session DELETE  /users/sign_out(.:format)     v1/custom_devise/sessions#destroy
       user_password POST    /users/password(.:format)     v1/custom_devise/passwords#create
                     PUT     /users/password(.:format)     v1/custom_devise/passwords#update
                     PATCH   /users/password(.:format)     v1/custom_devise/passwords#update
Run Code Online (Sandbox Code Playgroud)

但是现在我的请求失败了,原因是:

 AbstractController::ActionNotFound:
   Could not find devise mapping for path "/users/sign_in".
   This may happen for two reasons:

   1) You forgot to wrap your route inside the scope block. For example:

     devise_scope :user do
       get "/some/route" => "some_devise_controller"
     end

   2) You are testing a Devise controller bypassing the router.
      If so, you can explicitly tell Devise which mapping to use:

      @request.env["devise.mapping"] = Devise.mappings[:user]
Run Code Online (Sandbox Code Playgroud)

我尝试了许多变种,但都无济于事。

更新:这可能是矫kill过正,但这是一个示例示例应用程序对此进行了演示。不知道我是在做错什么,还是这可能是设计错误。

示例应用程序:https : //github.com/michaelirey/devise_weird

Som*_*ere 3

您缺少显示登录表单的登录操作的GET ..您只有会话创建,请像这样修复它(您:

devise_scope :user do
  get   '/users/sign_in'  => 'custom_devise/sessions#new',  as: :new_user_session      
  post   '/users/sign_in'  => 'custom_devise/sessions#create',  as: :user_session
  delete '/users/sign_out' => 'custom_devise/sessions#destroy', as: :destroy_user_session

  post  '/users/password'  => 'custom_devise/passwords#create', as: :user_password
  put   '/users/password'  => 'custom_devise/passwords#update', as: nil
  patch '/users/password'  => 'custom_devise/passwords#update', as: nil
end
Run Code Online (Sandbox Code Playgroud)