Très frustrant ces derniers jours.
J'ai une application Rails avec Devise installée, où j'ai généré un nouveau modèle utilisateur et des vues Devise.
Cela se produit lorsque j'essaie de me connecter en tant qu'utilisateur existant lorsque je clique sur "Connexion" après avoir renseigné les champs e-mail et mot de passe:
AbstractController::ActionNotFound - Could not find devise mapping for path "/sessions/user".
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]
:
devise (3.2.4) app/controllers/devise_controller.rb:84:in `unknown_action!'
devise (3.2.4) app/controllers/devise_controller.rb:59:in `assert_is_devise_resource!'
devise (3.2.4) app/controllers/devise_controller.rb:97:in `require_no_authentication'
activesupport (4.0.4) lib/active_support/callbacks.rb:397:in `_run__1955514966561508052__process_action__callbacks'
activesupport (4.0.4) lib/active_support/callbacks.rb:80:in `run_callbacks'
actionpack (4.0.4) lib/abstract_controller/callbacks.rb:17:in `process_action'
actionpack (4.0.4) lib/action_controller/metal/rescue.rb:29:in `process_action'
actionpack (4.0.4) lib/action_controller/metal/instrumentation.rb:31:in `block in process_action'
activesupport (4.0.4) lib/active_support/notifications.rb:159:in `block in instrument'
activesupport (4.0.4) lib/active_support/notifications/instrumenter.rb:20:in `instrument'
activesupport (4.0.4) lib/active_support/notifications.rb:159:in `instrument'
actionpack (4.0.4) lib/action_controller/metal/instrumentation.rb:30:in `process_action'
actionpack (4.0.4) lib/action_controller/metal/params_wrapper.rb:250:in `process_action'
activerecord (4.0.4) lib/active_record/railties/controller_runtime.rb:18:in `process_action'
actionpack (4.0.4) lib/abstract_controller/base.rb:136:in `process'
actionpack (4.0.4) lib/abstract_controller/rendering.rb:44:in `process'
actionpack (4.0.4) lib/action_controller/metal.rb:195:in `dispatch'
actionpack (4.0.4) lib/action_controller/metal/rack_delegation.rb:13:in `dispatch'
actionpack (4.0.4) lib/action_controller/metal.rb:231:in `block in action'
actionpack (4.0.4) lib/action_dispatch/routing/route_set.rb:80:in `dispatch'
actionpack (4.0.4) lib/action_dispatch/routing/route_set.rb:48:in `call'
actionpack (4.0.4) lib/action_dispatch/journey/router.rb:71:in `block in call'
actionpack (4.0.4) lib/action_dispatch/journey/router.rb:59:in `call'
actionpack (4.0.4) lib/action_dispatch/routing/route_set.rb:674:in `call'
warden (1.2.3) lib/warden/manager.rb:35:in `block in call'
warden (1.2.3) lib/warden/manager.rb:34:in `call'
rack (1.5.2) lib/rack/etag.rb:23:in `call'
rack (1.5.2) lib/rack/conditionalget.rb:35:in `call'
rack (1.5.2) lib/rack/head.rb:11:in `call'
actionpack (4.0.4) lib/action_dispatch/middleware/params_parser.rb:27:in `call'
actionpack (4.0.4) lib/action_dispatch/middleware/flash.rb:241:in `call'
rack (1.5.2) lib/rack/session/abstract/id.rb:225:in `context'
rack (1.5.2) lib/rack/session/abstract/id.rb:220:in `call'
actionpack (4.0.4) lib/action_dispatch/middleware/cookies.rb:486:in `call'
activerecord (4.0.4) lib/active_record/query_cache.rb:36:in `call'
activerecord (4.0.4) lib/active_record/connection_adapters/abstract/connection_pool.rb:626:in `call'
activerecord (4.0.4) lib/active_record/migration.rb:373:in `call'
actionpack (4.0.4) lib/action_dispatch/middleware/callbacks.rb:29:in `block in call'
activesupport (4.0.4) lib/active_support/callbacks.rb:373:in `_run__2142997860843545523__call__callbacks'
activesupport (4.0.4) lib/active_support/callbacks.rb:80:in `run_callbacks'
actionpack (4.0.4) lib/action_dispatch/middleware/callbacks.rb:27:in `call'
actionpack (4.0.4) lib/action_dispatch/middleware/reloader.rb:64:in `call'
actionpack (4.0.4) lib/action_dispatch/middleware/remote_ip.rb:76:in `call'
better_errors (1.1.0) lib/better_errors/middleware.rb:84:in `protected_app_call'
better_errors (1.1.0) lib/better_errors/middleware.rb:79:in `better_errors_call'
better_errors (1.1.0) lib/better_errors/middleware.rb:56:in `call'
actionpack (4.0.4) lib/action_dispatch/middleware/debug_exceptions.rb:17:in `call'
actionpack (4.0.4) lib/action_dispatch/middleware/show_exceptions.rb:30:in `call'
railties (4.0.4) lib/Rails/rack/logger.rb:38:in `call_app'
railties (4.0.4) lib/Rails/rack/logger.rb:20:in `block in call'
activesupport (4.0.4) lib/active_support/tagged_logging.rb:68:in `block in tagged'
activesupport (4.0.4) lib/active_support/tagged_logging.rb:26:in `tagged'
activesupport (4.0.4) lib/active_support/tagged_logging.rb:68:in `tagged'
railties (4.0.4) lib/Rails/rack/logger.rb:20:in `call'
quiet_assets (1.0.2) lib/quiet_assets.rb:18:in `call_with_quiet_assets'
actionpack (4.0.4) lib/action_dispatch/middleware/request_id.rb:21:in `call'
rack (1.5.2) lib/rack/methodoverride.rb:21:in `call'
rack (1.5.2) lib/rack/runtime.rb:17:in `call'
activesupport (4.0.4) lib/active_support/cache/strategy/local_cache.rb:83:in `call'
rack (1.5.2) lib/rack/lock.rb:17:in `call'
actionpack (4.0.4) lib/action_dispatch/middleware/static.rb:64:in `call'
rack (1.5.2) lib/rack/sendfile.rb:112:in `call'
railties (4.0.4) lib/Rails/engine.rb:511:in `call'
railties (4.0.4) lib/Rails/application.rb:97:in `call'
rack (1.5.2) lib/rack/lock.rb:17:in `call'
rack (1.5.2) lib/rack/content_length.rb:14:in `call'
rack (1.5.2) lib/rack/handler/webrick.rb:60:in `service'
/Users/AaronWilliamson/.rubies/Ruby-2.1.0/lib/Ruby/2.1.0/webrick/httpserver.rb:138:in `service'
/Users/AaronWilliamson/.rubies/Ruby-2.1.0/lib/Ruby/2.1.0/webrick/httpserver.rb:94:in `run'
/Users/AaronWilliamson/.rubies/Ruby-2.1.0/lib/Ruby/2.1.0/webrick/server.rb:295:in `block in start_thread'
Le fait est que, lorsque je m'inscris en tant que nouvel utilisateur, cela fonctionne parfaitement. Je peux remplir les champs appropriés, cliquer sur "Inscrivez-vous" et il me notifie que je me suis connecté avec succès et me redirige vers l'URL racine indiquant à l'utilisateur qu'il est connecté. L'erreur ne se produit que lorsque j'essaie de me connecter.
Voici mes itinéraires:
Ripelist::Application.routes.draw do
devise_for :users, path_names: { sign_in: 'login', sign_out: 'logout', sign_up: 'signup' }
root to: 'listings#index'
match '/sessions/user', to: 'devise/sessions#create', via: :post
resources :users
resources :listings
resources :categories
resources :sessions
end
Quelqu'un peut aider?
dans votre fichier routes.rb, essayez d’envelopper vos itinéraires dans le bloc d’étendue comme le suggère le message d’erreur. Voici un exemple:
devise_scope :user do
get "signup", to: "devise/registrations#new"
get "login", to: "devise/sessions#new"
get "logout", to: "devise/sessions#destroy"
end
Cela vous donnera des itinéraires bien nommés.
Et au fait, si vous utilisez Rails 4, supprimez la méthode de correspondance. vous devez spécifier le verbe HTTP.
(Ci-dessous, l'ancienne version obsolète du code, présentée à titre de référence. Utilisez le code ci-dessus.)
devise_for :users, path_names: { sign_in: 'login', sign_out: 'logout', sign_up: 'signup' }
ET
match '/sessions/user', to: 'devise/sessions#create', via: :post
Faites attention si vous nave les routes de type namespaced pour déclarer le système un peu différent:
namespace :api, defaults: {format: 'json'} do
namespace :v1 do
devise_scope :api_v1_user do
...
end
end
end
Cette erreur (AbstractController::ActionNotFound - Could not find devise mapping for path
) peut survenir si devise_scope
se voit attribuer une portée plurielle au lieu d'une portée singulière.
La méthode devise_for
prend une forme plurielle d’étendue de modèle (c'est-à-dire: utilisateurs) tandis que devise_scope
prend la forme singulière (c'est-à-dire :user
).
D'après les documents documentaires ( http://www.rubydoc.info/github/plataformatec/devise/ActionDispatch%2FRouting%2FMapper%3Adevise_scope ):
Sachez également que 'devise_scope' et 'en tant que' utilisent la forme singulière de , Le nom où d'autres commandes de routines relatives attendent la forme plurielle. Ce serait un bon exemple de travail.
devise_scope :user do get "/some/route" => "some_devise_controller" end devise_for :users
L'erreur vous dit:
devise_scope :user do
match '/sessions/user', to: 'devise/sessions#create', via: :post
end
avez-vous essayé ça?
devise_scope :user do
# add any route which is giving above error message
end