2012-01-30 60 views
0

我有兩個模型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 

將不勝感激指針,使這項工作! 謝謝

回答

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 
+0

感謝,但在數據庫中已存在的客戶對象。只是不明白爲什麼這不起作用;有沒有什麼辦法可以在保存之前'查看'內存中的Referal對象? – bobomoreno 2012-01-31 10:46:10

+0

有一些奇怪的事情發生。同時,您可以使用客戶ID構建您的推薦。像這樣:@ refer = @ customer.referals.new – 2012-01-31 19:00:37

+0

謝謝Aaron,修復它!我忽略了一個調用,在「@ customer.referals << @refer」行之前的Referal上設置了user_id(「@ user.referals << @refer」),因爲我認爲它是不相關的。這似乎是在customer_id設置之前保存記錄。通過交換兩條線(或您的解決方案),這是固定的 – bobomoreno 2012-02-01 20:36:12