2011-07-12 13 views
11

¿Hay un gancho o devolución de llamada que pueda implementar para que justo después de que se cree el usuario, me gustaría invocar algún código personalizado?diseñar después de crear el gancho

Intenté el hook after_confirmation en el modelo de usuario pero eso no funcionó.

Respuesta

17

Utilice la devolución de llamada estándar after_create proporcionada por Rails.

class User < ActiveRecord::Base 
    after_create :do_something 

    def do_something 
    puts "Doing something" 
    end 
end 
+0

¿Cómo puedo utilizar esto para acceder al usuario? Por ejemplo, quiero asignarle a un usuario un rol predeterminado usando Royce, por lo que solo es '@ usuario', entonces puedo hacer '@user.add_role: usuario' – Un3qual

+1

@ Un3qual' self' –

+0

¡Gracias! Me siento realmente estúpido ahora. – Un3qual

4

Usando una devolución de llamada es perfectamente legítimo si está tratando con el estado interno del modelo que ha creado.

Después de crear un User, que necesita para crear un defecto Team. Es preferible que evite utilizar devoluciones de llamada para tratar con otros objetos.

"after_ *" las devoluciones de llamada se utilizan principalmente en relación con el guardado o la persistencia del objeto. Una vez que se ha guardado el objeto, se ha cumplido el propósito (es decir, la responsabilidad) del objeto y, por lo tanto, lo que generalmente vemos son devoluciones de llamada que se extienden fuera de su área de responsabilidad, y es entonces cuando nos encontramos con problemas.

From this awesome blog post.

En este caso es mejor acto en el controlador, donde se puede añadir su funcionalidad directamente o delegate to a service para una solución aún mejor:

# shell 
rails g devise:controllers users 

# config/routes.rb 
devise_for :users, controllers: { registrations: "users/registrations" } 

# app/controllers/users/registrations_controller.rb 
class Users::RegistrationsController < Devise::RegistrationsController 
    after_action :create_default_team, only: :create 

    private 

    def create_default_team 
    Team.create_default(@user) if @user.persisted? 
    end 
end 
6

estoy usando los carriles 4 con Idear 3.5 con confirmable y tuvo que hacer esto debido a varias sorpresas.

class User < ActiveRecord::Base 
    # don't use after_create, see https://github.com/plataformatec/devise/issues/2615 
    after_commit :do_something, on: :create 

    private 

    def do_something 
     # don't do self.save, see http://stackoverflow.com/questions/22567358/ 
     self.update_column(:my_column, "foo") 
    end 
end