我有兩個模型Customer和Referal。兩者都有電子郵件屬性。 Referal屬於客戶和客戶has_many Referals。自定義Rails驗證似乎無法引用相關對象
當我創建/更新Referal時,我想檢查Referal上的電子郵件不等於Customer(父)對象上的電子郵件。
這裏是我的轉診對象:(切出不相關的東西)
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
當我試圖挽救轉診我得到「爲無未定義的方法`電子郵件」:NilClass 「,它指的是customer.email,因爲它在我把電子郵件==電子郵件時起作用。 此時Referal尚未寫入數據庫,儘管customer_id似乎已設置好,因爲我可以在錯誤消息(使用.to_s)中使用它,但它不起作用或者使用它來搜索Customer對象使用Customer.find(customer_id)。 (無ID找不到客戶)
爲了完整這裏是控制器位調用保存法對轉診:
@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
將不勝感激指針,使這項工作! 謝謝
感謝,但在數據庫中已存在的客戶對象。只是不明白爲什麼這不起作用;有沒有什麼辦法可以在保存之前'查看'內存中的Referal對象? – bobomoreno 2012-01-31 10:46:10
有一些奇怪的事情發生。同時,您可以使用客戶ID構建您的推薦。像這樣:@ refer = @ customer.referals.new – 2012-01-31 19:00:37
謝謝Aaron,修復它!我忽略了一個調用,在「@ customer.referals << @refer」行之前的Referal上設置了user_id(「@ user.referals << @refer」),因爲我認爲它是不相關的。這似乎是在customer_id設置之前保存記錄。通過交換兩條線(或您的解決方案),這是固定的 – bobomoreno 2012-02-01 20:36:12