多个Devise角色共享一个基表

时间:2013-07-25 00:16:34

标签: ruby-on-rails ruby devise ruby-on-rails-4

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

我有一个基本的用户模型,基于一个名为 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

我现在的问题是,客户端的PIN号码是由客户端模型中的 after_create 挂钩自动生成的。

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

我考虑过使用STI,但考虑到每个“角色”都有不同的专业字段,它可能不是最好的方法。

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

1 个答案:

答案 0 :(得分:2)

您可以更改为before_create hooks。

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发送电子邮件之前,您需要的所有信息都已准备就绪。