1

我正在用 Rails 4 和 Devise 编写一个系统。我的目标是拥有一个用户基础模型,然后允许每个用户成为客户、卖家或两者兼而有之,这样卖家就不能使用客户电子邮件,但客户也可以成为卖家。

我有一个基本的用户模型,并且基于一个名为create_as的属性,我创建了依赖表。我暂时使用两个has_one关系进行设置:

class User < ActiveRecord::Base
  devise :database_authenticatable, :registerable, :confirmable,
         :recoverable, :rememberable, :trackable, :validatable

  has_one :seller, dependent: :destroy
  has_one :client, dependent: :destroy

  after_create :create_client_or_seller

  attr_accessor :phone_number
  attr_accessor :create_as

  protected

  def create_client_or_seller
    if create_as == 'client'
      self.client = Client.create(phone_number: phone_number)
    elsif create_as == 'seller'
      self.seller = Seller.create
    end
  end
end

我现在的问题是,例如,客户端有一个由客户端模型中的after_create钩子自动生成的 PIN 码。

我想将此 PIN 号作为 Devise 发送的电子邮件的一部分发送以确认电子邮件地址,但我发现它是在调用 User after_create钩子 (create_client_or_seller) 之前发送的。

我考虑过使用 STI,但这可能不是最好的方法,因为每个“角色”都有不同的专业领域。

解决此问题的最佳方法是什么?

4

1 回答 1

2

您可以更改为 before_create 挂钩。

class User < ActiveRecord::Base
  ...
  before_create :build_client_or_seller

  protected

  def build_client_or_seller
    if create_as == 'client'
      self.client.build(phone_number: phone_number)
    elsif create_as == 'seller'
      self.seller.build
    end
  end
end

在 before_create 中也设置 PIN,您需要的所有信息都将在 Devise 发送电子邮件之前准备好。

于 2013-07-25T09:20:10.400 回答