2011-07-12 90 views
11

是否有一个挂钩或回调,我可以实现,以便在用户创建后,我想调用一些自定义代码?设计后创建挂钩

我试过在用户模型中的after_confirmation挂钩,但没有奏效。

回答

17

使用由Rails提供的标准after_create回调。

class User < ActiveRecord::Base 
    after_create :do_something 

    def do_something 
    puts "Doing something" 
    end 
end 
+0

我该如何使用它来访问用户?例如我想给用户一个使用Royce的默认角色,所以它只是'@ user',所以我可以做'@user.add_role:user' – Un3qual

+1

@Un3qual' self' –

+0

谢谢!我现在觉得很蠢。 – Un3qual

4

如果您正在处理您创建的模型的内部状态,那么使用回调是完全合法的。

创建User后,我需要创建默认的Team。最好避免使用回调来处理其他对象

“after_ *”回调函数主要用于保存或持久化对象。一旦物体被保存,物体的目的(即责任)就已经实现了,所以我们通常看到的是回传到其责任区之外,那就是当我们遇到问题时。

From this awesome blog post

在这种情况下,最好是行为控制器,在那里你可以成为一个更清洁的解决方案直接添加你的功能,或delegate to a service上:

# 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

我使用Rails 4设计3.5 confirmable,由于各种惊喜,不得不这样做。

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