web-dev-qa-db-fra.com

Définir Devise Login comme page racine

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?

76
Logan Bailey

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

113
Peter Nixey
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.

82
VvDPzZ
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.

23
Logan Bailey

(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")
14
Gilles

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.

9
Doug Steinberg

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

3
miccet

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
1
Jesse Farmer

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
0
Rui Castro