自定义Rails验证似乎无法引用相关对象

时间:2012-01-30 22:40:30

标签: ruby-on-rails validation

我有两个型号Customer和Referal。两者都有电子邮件属性。 Referal属于Customer和Customer has_many Referals。

当我创建/更新Referal时,我想检查Referal上的电子邮件与Customer(父)对象上的电子邮件不相等。

这是我的Referal对象:(删除不相关的东西)

class Referal < ActiveRecord::Base
  belongs_to :user
  belongs_to :customer

  validates :name, :presence => true
  validates :email, :presence => true
  validates_format_of :email, :with => /\A([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})\Z/i, :on => :create
  validate :email_cannot_equal_referers

  def email_cannot_equal_referers
    if email == customer.email
      errors.add(:email, "can't be the same as referer's")
    end
  end
end

这是客户:

class Customer < ActiveRecord::Base
  has_many :referals 
  validates_presence_of :name, :email
  validates_format_of :email, :with => /\A([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})\Z/i, :allow_blank => true
end

当我尝试保存Referal时,我得到“未定义的方法`电子邮件'为nil:NilClass”,它指的是customer.email,因为它在我发送电子邮件==电子邮件时有效。 此时Referal尚未写入数据库,虽然似乎设置了customer_id,因为我可以在错误消息(使用.to_s)中使用它,但它不能用于使用它来搜索Customer对象Customer.find(CUSTOMER_ID)。 (找不到没有ID的客户)

为了完整性,这里的控制器位调用Referal上的save方法:

@refer=Referal.new
@refer.name=params[:Name2]
@refer.email=params[:Email2]
@refer.message=params[:Message]
@customer.referals << @refer
if @refer.save
  CustomerMailer.refer(@refer).deliver
  CustomerMailer.refer_thanks(@refer).deliver
else
  render 'new_refer'
end

非常感谢指点让这项工作! 感谢

1 个答案:

答案 0 :(得分:0)

如果客户已经存在于数据库中,那么您的验证应该有效。

如果您尝试同时创建客户和推介,我将通过客户模型使用accepts_nested_attributes_for方法。我认为您可能需要在客户模型中添加一个循环验证的验证。

class Customer < ActiveRecord::Base
    has_many :referals
    accepts_nested_attributes_for :referals
end

然后在您的控制器中

@customer.referals << @refer
if @customer.save
   @customer.referals.each do |r|
      CustomerMailer.refer(r).deliver
      CustomerMailer.refer_thanks(r).deliver
   end
 end