创建钩子后设计

时间:2011-07-12 00:42:42

标签: ruby-on-rails-3 devise

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

我在用户模型中尝试了after_confirmation hook,但是没有用。

3 个答案:

答案 0 :(得分:19)

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

class User < ActiveRecord::Base
  after_create :do_something

  def do_something
    puts "Doing something"
  end
end

答案 1 :(得分:6)

我使用带有confirmable的Devise 3.5的Rails 4,并且由于各种意外而不得不这样做。

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

答案 2 :(得分:5)

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

创建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