2010-02-09 21 views
6

En mi aplicación, solo los usuarios con la función de administrador pueden crear nuevos usuarios. En el nuevo formulario de usuario, tengo un cuadro de selección para cada uno de los roles disponibles que se pueden asignar a nuevos usuarios.Rieles: ¿Puedes pasar argumentos al método after_create?

Espero utilizar el método de devolución de llamada after_create para asignar la función al usuario. ¿Cómo puedo acceder al valor seleccionado del cuadro de selección en el método after_create?

def create 
    @user = User.new(params[:user]) 

    respond_to do |format| 
     if @user.save 
     flash[:notice] = 'User creation successful.' 
     format.html { redirect_to @user } 
     else 
     format.html { render :action => 'new' } 
     end 
    end 
    end 

En el modelo de usuario que tienen:

after_create :assign_roles 

    def assign_roles 
    self.has_role! 'owner', self 
    # self.has_role! params[:role] 
    end 

recibo un error porque el modelo no sabe qué papel es.

Respuesta

13

Puede usar attr_accessor para crear un atributo virtual y establecer ese atributo como parte de su acción de creación.

+1

Sí, lo que desea es un "atributo virtual" para contener la selección de la casilla de verificación. Hay un gran Railscast sobre esto: http://railscasts.com/episodes/167-more-on-virtual-attributes –

4

La respuesta corta es, no. No puede pasar ningún argumento a after_create.

Sin embargo, lo que intenta hacer es bastante común y hay otras formas de evitarlo.

La mayoría de ellos implica asignar la relación antes de que se cree el objeto en cuestión, y dejar que ActiveRecord se encargue de todo.

La manera más fácil de lograr eso depende de la relación entre Roles y Usuarios. Si es de uno a varios (cada usuario tiene un rol), haga que sus usuarios pertenezcan a un rol y envíen role_id a través del formulario.

<%= f.collection_select :role_id, Role.all, :id, :name %> 

si hay una relación muchos a muchos entre los usuarios y los roles a alcanzar la misma mediante la asignación a @ user.role_ids

<%= f.collection_select :role_ids, Role,all, :id, :name, {}, :multiple => :true %> 

El controlador en cualquiera de los casos parece

def create 
    @user = User.new(params[:user]) 

    respond_to do |format| 
    if @user.save 
     flash[:notice] = 'User creation successful.' 
     format.html { redirect_to @user } 
    else 
     format.html { render :action => 'new' } 
    end 
    end 
end 
Cuestiones relacionadas