2011-06-13 11 views
9

Estoy probando Devise por primera vez. Una de las cosas que quería hacer es proporcionar una interfaz para que los usuarios de Admin creen, encuentren y editen usuarios. Aquí es donde puedo haber ido mal.Admin administración del usuario con Devise

Creé una clase PeopleController que hereda de ApplicationController que enumera personas y proporciona métodos y vistas para crear y actualizar usuarios. Todo funciona bien con una excepción. Cuando el usuario administrador actualiza su propio registro, la sesión se borra y tiene que iniciar sesión nuevamente después de guardarla.

En esta aplicación no estoy usando el módulo de registro. Solo un usuario administrador puede crear nuevos usuarios. ¿Cuál es la forma correcta de diseñar herramientas de administración de usuarios? Crear mi propio controlador parece haber sido el camino equivocado a seguir.

Gracias de antemano por su ayuda.

Respuesta

7

Muchas gracias por la ayuda. Esto es esencialmente exactamente lo que estoy haciendo. He descubierto una pista que me ayudó a resolver el problema de la sesión del usuario se borra cuando editan su propio récord en el wiki:

https://github.com/plataformatec/devise/wiki/How-To:-Allow-users-to-edit-their-account-without-providing-a-password

Ésta es la línea que necesitaba:

sign_in resource_name, resource, :bypass => true 

Este El método se encuentra en Devise :: Controllers :: Helpers, así que lo hice en mi controlador.

class PeopleController < ApplicationController 
    include Devise::Controllers::Helpers 

Luego, en mi método de actualización que llaman sólo si el current_user.id es igual a la identificación que se está editando:

def update 
    @person = User.find(params[:id]) 
    if @person.update_attributes(params[:user]) 
    sign_in @person, :bypass => true if current_user.id == @person.id 
    redirect_to person_path(@person), :notice => "Successfully updated user." 
    else 
    render :action => 'edit' 
    end 
end 

Ahora bien, si el usuario actual edita su propio registro, la sesión se restaura después de que se guarda.

Gracias de nuevo por sus respuestas.

6

Así es como administro usuarios en una de mis aplicaciones. Sólo tengo una User clase generada con

rails g devise User 

a la que he añadido una columna role con esta migración:

class AddRoleToUser < ActiveRecord::Migration 
    def change 
    add_column :users, :role, :string, :default => "client" 
    end 
end 

y mi modelo User:

class User < ActiveRecord::Base 
    # Include default devise modules. Others available are: 
    # :token_authenticatable, :confirmable, :lockable and :timeoutable 
    devise :database_authenticatable, :recoverable, :rememberable, :trackable, :validatable 

    # Setup accessible (or protected) attributes for your model 
    attr_accessible :email, :password, :password_confirmation, :remember_me 

    def admin? 
    self.role == "admin" 
    end 
end 

A continuación, para crear nuevos usuarios todo lo que tendría que hacer es proporcionar un método personalizado en un controlador (tal vez incluso la subclase Devise::RegistrationsController) de esta manera:

# some_controller.rb 
def custom_create_user 
    if current_user.admin? 
    User.create(:email => params[:email], password => params[:password]) 
    redirect_to(some_path, :notice => 'sucessfully updated user.') 
    else 
    redirect_to(some_other_path, :notice => 'You are not authorized to do this.') 
    end 
end 
+0

También recomendaría, tal vez, ir con un modelo "Role" por separado, de modo que un usuario puede tener múltiples roles si es necesario. Probablemente haría todo más fácil también. Luego, un modelo de unión, tal vez llamado "UserRole", que tendría el user_id y role_id. – ardavis

+0

Eso es cierto, aunque normalmente uso [cancan] (https://github.com/ryanb/cancan) cuando necesito definir múltiples roles o permisos complejos. – David

+3

También uso CanCan, pero aún utilizo un modelo de rol separado. Echa un vistazo a esta impresionante página wiki que Ryan Bates hizo: https://github.com/ryanb/cancan/wiki/Separate-Role-Model – ardavis

Cuestiones relacionadas