我有两个型号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
非常感谢指点让这项工作! 感谢
答案 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