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
''/users/sign_in'' предназначен для разработки новой сессии, поэтому вам понадобится маршрут 'new_user_session'. – CharlesJHardy
@CharlesJHardy: запрос 'GET' для'/users/sign_in' не нужен, так как это API. –
Неужели эти неудачи происходят в тестах или в разработке? –