2010-09-30 6 views
38

J'essaie de faire fonctionner des routes personnalisées dans mon application Rails (Ruby 1.9.2 avec Rails 3).Créer des routes personnalisées et des pages de connexion

Ceci est mon fichier config/routes.rb

match '/dashboard' => 'home#dashboard', :as => 'user_root' 
devise_for :user do 
    get "/login", :to => "devise/sessions#new" # Add a custom sign in route for user sign in 
    get "/logout", :to => "devise/sessions#destroy" # Add a custom sing out route for user sign out 
    get "/register", :to => "devise/registrations#new" # Add a Custom Route for Registrations 
end 

Mais en soumettant le formulaire de connexion/ou/registre va aux utilisateurs/sign_in et les utilisateurs/sign_up. Comment puis-je empêcher cela. Ou mieux encore, assurez-vous que par défaut toutes les demandes d'utilisateurs/sign_in etc vont sur les routes pertinentes et non sur les routes par défaut générées par Devise.

Comment puis-je rendre partiel le formulaire de connexion pour l'inclure dans n'importe quel contrôleur? Pour que je puisse avoir la page de connexion sur la page d'accueil (home # index) et non sur les utilisateurs/sign_in? J'utilise Devise 1.1.3 avec Rails 3 sur Ruby 1.9.2, sous Mac OSX Snow Leopard.

Merci!

Répondre

74

Avec les éléments suivants 1.1.3 Devise devrait fonctionner

devise_for :user, :path => '', :path_names => { :sign_in => "login", :sign_out => "logout", :sign_up => "register" } 

Les routes qu'il crée ne sera pas jointe avec «/user/... "parce que le paramètre :path est une chaîne vide. Le hash :pathnames prendra soin de nommer les routes que vous le souhaitez.Concevoir utilisera ces routes en interne afin de soumettre à/connexion fonctionnera comme vous le souhaitez et non vous amène à/user/log_in

Pour ajouter un formulaire de connexion à votre page d'accueil il y a d'infos sur la Devise Wiki: http://github.com/plataformatec/devise/wiki/How-To:-Display-a-custom-sign_in-form-anywhere-in-your-app

Ou faire quelque chose comme ceci:

<%= form_tag new_user_session_path do %> 
    <%= text_field_tag 'user[email]' %> 
    <%= password_field_tag 'user[password]' %> 
<%= submit_tag 'Login' %> 
+1

Dans le code que vous mettez ": path", dans le texte que vous avez dit ": as", fixe. – tokland

+7

notice Devise 2.1.2 (version plus récente) utilise le pluriel 'devise_for: users' – AJcodez

+0

Cette approche fonctionne, mais vous êtes bloqué en utilisant les helpers de Devise path par défaut comme' new_user_session_path'. Pour obtenir des helpers comme 'login_path', vous pouvez mettre le bloc' devise_for: user do' que l'OP a juste en dessous de cette réponse, et vous obtiendrez le meilleur des deux mondes. –

0

Utilisez ce en haut de votre fichier routes.rb

map.connect "users/:action", :controller => 'users', :action => /[a-z]+/i 

d'utiliser sur l'endroit où votre fichier d'index est. si elle est sur votre modèle de l'utilisateur, utilisez ce qui précède ou modifier en conséquence

+0

Est-ce que ce travail pour avoir les pages de connexion sur la page d'accueil. Ils résident dans l'index de la maison. Et imagine (http://github.com/plataformatec/devise/) utilise le modèle utilisateur. –

+0

Ne fonctionne pas. Le nom de mon contrôleur est à la maison et il ne détecte pas l'itinéraire/sur la page d'accueil. –

3

Vous avez juste besoin de ne pas mettre votre itinéraire spécial dans devise_for bloc

match '/dashboard' => 'home#dashboard', :as => 'user_root' 
get "/login", :to => "devise/sessions#new" # Add a custom sign in route for user sign in 
get "/logout", :to => "devise/sessions#destroy" # Add a custom sing out route for user sign out 
get "/register", :to => "devise/registrations#new" # Add a Custom Route for Registrations 
devise_for :user 

travaille maintenant/login./users/sign_in aussi.

+2

Je ne veux pas que l'itinéraire users/sign_in fonctionne. Je veux seulement que les routes personnalisées fonctionnent et qu'elles soient actives dans tous les contrôleurs et vues qui l'utilisent. –

1

J'ai créé mon propre contrôleur auth et mis en déroute le contrôleur de sessions à concevoir mon contrôleur

devise_for :users, 
:controllers => { 
    :sessions => 'auth' }, 

:path => '/', 

:path_names => { 
    :sign_in => 'login', 
    :sign_out => 'logout' } 

Ce code ajoutera/connexion et/déconnexion urls.

En savoir plus sur ce que vous pouvez trouver dans le code source http://github.com/plataformatec/devise/blob/master/lib/devise/rails/routes.rb

+0

La solution de Canthiswait fonctionne très bien, donc je n'ai pas essayé de créer un nouveau contrôleur personnalisé. –

+0

gr8 :) bien sûr, vous n'avez pas besoin de réglage du contrôleur: path_names est crucial – Vlada

5

ce qui suit a fonctionné pour moi:

devise_for :users do 
    get "/login" => "devise/sessions#new" 
    get "/register" => "devise/registrations#new" 
    end 
1

Config:

devise_scope :user do 
    get 'profile/edit' => 'devise/registrations#edit', :as => :edit_user_registration 
    get 'profile/cancel' => 'devise/registrations#cancel', :as => :cancel_user_registration 
    end 

    devise_for :users, 
       :path => '', 
       :path_names => { :sign_in =>  'login', 
           :sign_out =>  'logout', 
           :sign_up =>  '', 
           :registration => 'register', 
           :edit =>   'edit', 
           :cancel =>  'cancel', 
           :confirmation => 'verification' } 

Routes:

edit_user_registration GET /profile/edit(.:format)  devise/registrations#edit 
cancel_user_registration GET /profile/cancel(.:format) devise/registrations#cancel 
     new_user_session GET /login(.:format)    devise/sessions#new 
      user_session POST /login(.:format)    devise/sessions#create 
    destroy_user_session DELETE /logout(.:format)   devise/sessions#destroy 
      user_password POST /password(.:format)   devise/passwords#create 
     new_user_password GET /password/new(.:format)  devise/passwords#new 
     edit_user_password GET /password/edit(.:format)  devise/passwords#edit 
         PATCH /password(.:format)   devise/passwords#update 
         PUT /password(.:format)   devise/passwords#update 
         GET /register/cancel(.:format) registrations#cancel 
     user_registration POST /register(.:format)   registrations#create 
    new_user_registration GET /register(.:format)   registrations#new 
         GET /register/edit(.:format)  registrations#edit 
         PATCH /register(.:format)   registrations#update 
         PUT /register(.:format)   registrations#update 
         DELETE /register(.:format)   registrations#destroy 
Questions connexes