J'utilise le code suivant pour mes itinéraires:
devise_for :user,
:as => '',
:path_names => {
:sign_in => "",
:sign_out => "logout",
:sign_up => "register"
}
Mais quand je suis déconnecté et que je suis allé /logout
J'obtiens l'erreur suivante:
Aucun itinéraire ne correspond à {: action => "new",: controller => "devise/sessions"}
Comment configurer le chemin racine pour être à :sign_in
action?
Pour faire suite aux personnes qui posent des questions sur l'erreur Could not find devise mapping for path "/"
il existe une solution de contournement.
Vous constaterez qu'il y a un indice dans vos journaux qui dira probablement:
[Devise] Could not find devise mapping for path "/".
This may happen for two reasons:
1) You forgot to wrap your route inside the scope block. For example:
devise_scope :user do
match "/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]
J'ai donc réessayé l'approche, mais à la place (comme le suggère @miccet) dans un bloc de portée:
devise_scope :user do
root to: "devise/sessions#new"
end
CA marchait bien pour moi
devise_for :users
devise_scope :user do
authenticated :user do
root 'home#index', as: :authenticated_root
end
unauthenticated do
root 'devise/sessions#new', as: :unauthenticated_root
end
end
Tout comme cela, testé sur Rails Rails 4.1.0.rc1.
root :to => "devise/sessions#new"
J'avais besoin de définir la racine d'accueil par défaut. J'avais l'impression d'avoir essayé ça toute la nuit dernière (avant de poster la question), mais ça fonctionne maintenant. Si vous êtes déconnecté, Devise tente de vous rediriger vers le chemin racine que je n'avais pas défini.
(Cela a été publié sous la forme modification suggérée , mais aurait dû être une réponse à part. Je ne sais pas si cela a du sens ou non. Cher éditeur anonyme : n'hésitez pas à republier cette réponse comme la vôtre, et laissez-moi un commentaire donc je vais supprimer cette copie.)
root :to => redirect("/users/login")
J'ai réussi à travailler avec la réponse @VvDPzZ. Mais j'ai dû le modifier légèrement
devise_scope :business_owner do
authenticated do
root to: 'pages#dashboard'
end
unauthenticated do
root to: 'devise/sessions#new', as: 'unauthenticated_root'
end
end
Je devais ajouter to:
dans la déclaration du chemin racine. J'ai également supprimé le as: :authenticated_root
parce que j'avais déjà des endroits dans mon application référençant root_path
dans les liens. En omettant le as: :authenticated_root
partie, je n'ai eu à modifier aucun de mes liens existants.
Je suppose que vous avez différents rôles d'utilisateur. Si vous devez ajouter une étendue comme celle-ci à la ressource utilisateurs:
devise_scope :user do
get "/logout" => "devise/sessions#destroy"
end
Vous pouvez en savoir plus sur la substitution des itinéraires de devise ici: https://github.com/plataformatec/devise/wiki/How-To:-Change-the-default-sign_in-and-sign_out-routes
Certaines de ces solutions sont beaucoup trop complexes. Utilisez simplement Rails:
Ajouter 'get' 'users/root', to: 'users#root'
dans config/routes.rb.
Dans UsersController, faites quelque chose comme:
def root
if user_signed_in?
redirect_to root_for_signed_in_user_path (or whatever)
else
redirect_to new_user_session_path
end
end
En utilisant Rails 3.2 et devise 3.2. je parviens à configurer ma page d'accueil "home # index" (action du contrôleur #) comme page de connexion apportant les modifications suivantes.
# 1 Ajout du formulaire de connexion à la page d'accueil:
<%= simple_form_for(resource, as: resource_name, url: session_path(resource_name)) do |f| %>
<%= f.input :email %>
<%= f.input :password %>
<%= f.button :submit %>
<% end %>
# 2 Ajout des méthodes nom_ressource, ressource et mappage de devise à app/holdpers/application_helper.rb:
def resource_name
:user
end
def resource
@resource ||= User.new
end
def devise_mapping
@devise_mapping ||= Devise.mappings[:user]
end
# Créé un contrôleur de sessions personnalisé app/controllers/users/sessions_controller.rb:
class Users::SessionsController < Devise::SessionsController
protected
# This method tell sessions#create method to redirect to home#index when login fails.
def auth_options
{ scope: resource_name, recall: 'home#index' }
end
end
# 4 Ignorez les routes de session et configurez le contrôleur de sessions personnalisé dans config/routes.rb:
devise_for :users, path: 'auth', skip: [:sessions],
controllers: {
sessions: 'users/sessions'
}
as :user do
get 'auth/sign_in' => 'home#index', as: :new_user_session
post 'auth/sign_in' => 'users/sessions#create', as: :user_session
delete 'auth/sign_out' => 'users/sessions#destroy', as: :destroy_user_session
end