2014-01-22 177 views
4
Using devise (3.2.2) 
Using rails (4.0.2) 

致力於開發僅需要特定路線的API。我有以下在我的routes.rb自定義設計路線

devise_for :users, path: '/users', controllers: { 
    sessions: 'v1/custom_devise/sessions', 
    passwords: 'v1/custom_devise/passwords' 
} 

太棒了!現在,我們有所有這些路線:

   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 

但我不想要或需要這些路線:

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 

所以我想我會剛剛創建自己的路線按文檔。所以我改變了我的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 

現在我的路線看起來很完美,現在的樣子,我希望他們:

   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 

但現在我的請求失敗,有:

AbstractController::ActionNotFound: 
    Could not find devise mapping for path "https://stackoverflow.com/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] 

我有嘗試了很多變化,無濟於事。

更新:這可能是矯枉過正,但這裏是一個示例應用程序演示此示例。不知道我是否做錯了什麼,或者這可能是一個設計錯誤。

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

+0

''/ users/sign_in「'是爲了設計會議新的,所以你將需要'new_user_session'路線。 – CharlesJHardy

+0

@CharlesJHardy:'/ users/sign_in'的GET請求不需要,因爲這是一個API。 –

+0

這些故障是在測試還是在開發過程中發生的? –

回答

2

你缺少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 
+1

不知道這是否回答了發佈的問題,但肯定幫助我將問題降落在此頁面上。謝謝! – woodardj

0

從這個問題BTW另外,在OP得到了關於這個問題在這裏運動: https://github.com/plataformatec/devise/issues/2840

這可以解釋爲什麼它在2014年8月曾失敗後荷蘭國際集團在一月2014

線程的收盤評論是:

這應該可以幫助任何人在2016年 http://stackoverflow.com/questions/22063026/how-do-i-override-devise-controller-and-devise-routes-at-the-same-time

和:

人仍然面臨着這樣的問題,甚至後做

devise_for :users, skip: :all devise_scope :user do end

請參閱此問題#2496如果您在名稱空間內調用 devise_scope。