разработать после создания крючка - PullRequest
12 голосов
/ 12 июля 2011

Есть ли ловушка или обратный вызов, которые я могу реализовать, чтобы сразу после создания пользователя я хотел бы вызвать некоторый пользовательский код?

Я пробовал ловушку after_confirmation в пользовательской модели, но это не такработа.

Ответы [ 3 ]

19 голосов
/ 12 июля 2011

Используйте стандартный after_create обратный вызов, предоставленный Rails.

class User < ActiveRecord::Base
  after_create :do_something

  def do_something
    puts "Doing something"
  end
end
6 голосов
/ 18 февраля 2016

Я использую Rails 4 с Devise 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
5 голосов
/ 19 апреля 2015

Использование обратного вызова вполне допустимо, если вы имеете дело с внутренним состоянием созданной вами модели.

После создания User мне нужно было создать по умолчанию Team.Предпочтительно избегать использования обратных вызовов для работы с другими объектами .

«after_ *» обратные вызовы в основном используются для сохранения или сохранения объекта.Как только объект сохранен, цель (т.е. ответственность) объекта была выполнена, и поэтому мы обычно видим обратные вызовы, выходящие за пределы области его ответственности, и именно тогда мы сталкиваемся с проблемами.

Из этого потрясающего сообщения в блоге .

В этом случае лучше воздействовать на контроллер , где вы можете добавить свою функциональность напрямую или делегироватьна услугу для еще более чистого решения:

# 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...