2014-01-22 5 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] 

У меня есть попробовал много вариантов, но безрезультатно.

ОБНОВЛЕНИЕ: Это может быть излишним, но вот пример примера демонстрации приложения. Не уверен, что я делаю что-то неправильно или если это может быть ошибка в разработке.

Sample App: https://github.com/michaelirey/devise_weird

+0

''/users/sign_in'' предназначен для разработки новой сессии, поэтому вам понадобится маршрут 'new_user_session'. – CharlesJHardy

+0

@CharlesJHardy: запрос 'GET' для'/users/sign_in' не нужен, так как это 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 Отдельно от этого вопроса, ОП есть движение по этому вопросу здесь: https://github.com/plataformatec/devise/issues/2840

Это может объяснить, почему он работал в августе 2014 года после того, как не в состоянии ING в январе 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 внутри пространства имен.

Смежные вопросы