2010-12-20 5 views
11

J'ai une application Rails 3 avec configuration d'authentification en utilisant Devise avec le module registerable activé.Rails: (Devise) Deux méthodes différentes pour les nouveaux utilisateurs?

Je veux avoir de nouveaux utilisateurs qui inscrivent en utilisant notre formulaire de registre extérieur pour utiliser le module complet registerable Devise, ce qui se passe maintenant.

Cependant, je veux aussi l'utilisateur admin pour pouvoir créer de nouveaux utilisateurs directement, sans passer (je pense) Module registerable de Devise.

  • Avec registerable désactivé, mon UsersController fonctionne comme norme je veux qu'il admin pour l'utilisateur, comme tout autre échafaudage ferroviaire. Cependant, les nouveaux utilisateurs ne peuvent plus s'enregistrer seuls.

  • Avec registerable permis, ma norme UsersController est jamais appelé à la nouvelle action de l'utilisateur (appelant Devise::RegistrationsController à la place), et mes actions CRUD ne semblent pas fonctionner du tout (je me jetai en arrière sur ma page racine sans nouvelle utilisateur créé et pas de message flash). Voici le journal de la demande:

    Started POST "/users" for 127.0.0.1 at 2010-12-20 11:49:31 -0500 
    Processing by Devise::RegistrationsController#create as HTML 
    Parameters: {"utf8"=>"✓", "authenticity_token"=>"18697r4syNNWHfMTkDCwcDYphjos+68rPFsaYKVjo8Y=", "user"=>{"email"=>"[email protected]", "password"=>"[FILTERED]", "password_confirmation"=>"[FILTERED]", "role"=>"manager"}, "commit"=>"Create User"} 
    SQL (0.9ms) ... 
    
    User Load (0.6ms) SELECT "users".* FROM "users" WHERE ("users"."id" = 2) LIMIT 1 
    SQL (0.9ms) ... 
    
    Redirected to http://test-app.local/ Completed 302 Found in 192ms 
    

... mais je suis en mesure d'enregistrer de nouveaux utilisateurs par la forme extérieure.

Comment puis-je obtenir ces deux méthodes pour travailler ensemble, de sorte que mon admin utilisateur peut créer manuellement de nouveaux utilisateurs et utilisateurs invités peuvent inscrire eux-mêmes?


J'ai mes utilisateurs la configuration du contrôleur pour CRUD standard:

class UsersController < ApplicationController 
    load_and_authorize_resource 

    def index 
    @users = User.where("id NOT IN (?)", current_user.id) # don't display the current user in the users list; go to account management to edit current user details 
    end 

    def new 
    @user = User.new 
    end 

    def create 
    @user = User.new(params[:user]) 
    if @user.save 
     flash[:notice] = "#{ @user.email } created." 
     redirect_to users_path 
    else 
     render :action => 'new' 
    end 
    end 

    def edit 
    end 

    def update 
    params[:user].delete(:password) if params[:user][:password].blank? 
    params[:user].delete(:password_confirmation) if params[:user][:password].blank? and params[:user][:password_confirmation].blank? 
    if @user.update_attributes(params[:user]) 
     flash[:notice] = "Successfully updated User." 
     redirect_to users_path 
    else 
     render :action => 'edit' 
    end 
    end 

    def delete 
    end 

    def destroy 
    redirect_to users_path and return if params[:cancel] 
    if @user.destroy 
     flash[:notice] = "#{ @user.email } deleted." 
     redirect_to users_path 
    end 
    end 

end 

Et mes itinéraires configuration comme suit:

TestApp::Application.routes.draw do 

    devise_for :users 

    devise_scope :user do 
    get "/login", :to => "devise/sessions#new", :as => :new_user_session 
    get "/logout", :to => "devise/sessions#destroy", :as => :destroy_user_session 
    end 

    resources :users do 
    get :delete, :on => :member 
    end 

    authenticate :user do 
    root :to => "application#index" 
    end 
    root :to => "devise/session#new" 

end 

Répondre

12

Vous devez créer un contrôleur distinct pour gérer vos utilisateurs. Je crée toujours les utilisateurs d'administrateur et de leur donner un espace de noms spécial pour travailler en Illustrons que:.

config/routes.rb

devise :users # Allow users to register here 

namespace :admin do 
    resources :users # Have the admin manage them here. 
end 
+3

Duh! C'était la sauce secrète que je cherchais. Résout tant de problèmes ... excusez-moi pendant que je vais me cogner la tête contre un mur. Merci. – neezer

+0

Comment donner un espace de noms dans le contrôleur? –

+0

Voici un peu plus de détails sur l'utilisation des espaces de noms dans Rails.Vous aurez besoin de créer un dossier dans l'application> contrôleurs - dans cet exemple, vous mettrez un nouveau dossier admin dans le dossier des contrôleurs et ensuite mettre votre nouveau contrôleur d'utilisateurs là. Les fichiers doivent ensuite être accessibles via applcom/admin/users - http://guides.rubyonrails.org/routing.html#controller-namespaces-and-routing –

0

vous avez besoin d'ajouter cette configuration dans votre routes.rb

devise_for :users, :controllers => {:registrations => "users/registrations" } 

puis implémentez votre propre contrôleur d'enregistrement comme ceci

class Users::RegistrationsController < Devise::RegistrationsController 
    def new 
    ... 
    end 

    ## other actions 
end 

puis vous pouvez écrire vos propres vues si le contrôleur par défaut de votre machine de remplacement, peut-être vous perdrez une certaine fonction, par ex. validations. vous devez les implémenter par vous-même

Questions connexes