我是否可以实现一个钩子或回调,以便在创建用户之后,我想调用一些自定义代码?
我在用户模型中尝试了after_confirmation hook,但是没有用。
答案 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_ *”回调主要用于保存或持久化对象。一旦保存了对象,就完成了对象的目的(即责任),因此我们通常看到的是回调到达其责任区域之外,那就是我们遇到问题时。
在这种情况下,最好在控制器上操作,您可以直接添加您的功能,或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