2014-06-10 27 views
1

在我Purchase模型中,我有一個計算稅收的方法:Rails:添加錯誤[:base]不會使記錄無效?

def calculate_tax 
    if self.shipping_address.state == State.new_york 
    corresponding_tax = Tax.find_by(zip_code: self.shipping_address.zip_code, state_id: self.shipping_address.state_id) 
    if corresponding_tax 
     self.tax = corresponding_tax.rate * (self.subtotal + shipping) 
    else 
     #HERE !!! 
     self.errors[:base] << "The zip code you have entered is invalid." 
     puts "errors = #{self.errors.full_messages}" #<-- this prints out the error in my log, so I know it's being run 
    end 
    else 
    self.tax = 0.00 
    end 
end 

這種方法被調用此方法中:

def update_all_fees! 
    calculate_subtotal 
    calculate_shipping 
    calculate_tax #<-- being called here 
    calculate_total 
    save! 
end 

然而,save!成功地保存記錄。它不應該拋出異常嗎?我將如何讓它保存! calculate_tax在第二個else區塊時失敗?

回答

1

您可以使用validate指令添加自定義驗證方法。以下是您所發佈的代碼:

class Purchase < ActiveRecord::Base 
    validate :new_york_needs_tax_record 

    def update_all_fees! 
    calculate_subtotal 
    calculate_shipping 
    calculate_tax 
    calculate_total 
    save! 
    end 

    private 

    def calculate_tax 
    if ships_to_new_york? && corresponding_tax 
     self.tax = corresponding_tax.rate * (self.subtotal + shipping) 
    elsif !ships_to_new_york? 
     self.tax = 0.00 
    else 
     self.tax = nil 
    end 
    end 

    def ships_to_new_york? 
    self.shipping_address.state == State.new_york 
    end 

    def corresponding_tax 
    Tax.find_by(zip_code: self.shipping_address.zip_code, state_id: self.shipping_address.state_id) 
    end 

    def new_york_need_tax_record 
    if ships_to_new_york? && !corresponding_tax 
     self.errors[:base] << "The zip code you have entered is invalid." 
    end 
    end 
end 
0

只需將錯誤添加到錯誤列表中,不會使記錄失敗。你必須有所謂的「驗證」設置。關於它的一些精彩指南here應該可以幫助你完成整個過程。

例如在這其中,你可能會想添加到您的稅制模式下驗證:

validates :zip_code, presence: true, numericality: true

一旦你設置了驗證,save!應自動吐出一個錯誤,當一個模型驗證失敗

+0

驗證郵政編碼將無濟於事。我沒有驗證Tax模式,我試圖查看給定的郵政編碼是否有匹配的稅收記錄。 – Edmund

+0

啊,我看到了。然後@ JorgedelosSantos的答案應該能夠幫助你。 – MCBama

1

作爲您的問題的答案添加錯誤不會使記錄無效。但是,如果你需要提高的錯誤,如果有任何只是做:

before_save:check_errors

def check_errors 
    raise RecordInvalid.new(self) if self.errors.any? 
end 

這將檢查.save調用之前添加的錯誤。