Ruby on rails Rails:添加到错误[:base]不会使记录无效?
在我的Ruby on rails Rails:添加到错误[:base]不会使记录无效?,ruby-on-rails,Ruby On Rails,在我的购买模型中,我有一种计算税收的方法: 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
购买
模型中,我有一种计算税收的方法:
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计算税
如果self.shipping\u address.state==state.new\u york
相应的税=税。查找人(邮政编码:self.shipping\u address.zip\u code,state\u id:self.shipping\u address.state\u id)
如果相应的税
self.tax=相应的_税税率*(self.subtotal+运费)
其他的
#这里!!!
self.errors[:base]简单地将错误添加到错误列表不会使记录失败。你必须进行所谓的“验证”设置。有一些很棒的指南可以帮助你完成这个过程
例如,在本例中,您可能希望在税务模型中添加以下验证:
验证:邮政编码、状态:true、数字性:true
设置验证后,save当模型验证失败时,代码>应自动抛出错误
由于历史原因而编辑。第一个回答并没有涵盖所有情况。
但如果您需要提出错误(如果有),请执行以下操作:
validate :taxes_scenario
def taxes_scenario
[Add any clause here that makes your scenario invalid]
end
因此,您可以验证税务场景,并确保正确添加错误。您可以使用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
class-Purchase self.errors[:base]验证邮政编码没有帮助。我不是在税务模型上验证,我只是想看看给定邮政编码是否有匹配的税务记录。那么@JorgedelosSantos的答案应该能帮到你。这可能不太管用。有效吗?方法清除所有错误,然后运行其验证设置新错误。如果在保存之前调用,则添加的错误将被“无意”清除。是否未检查保存呼叫是否有效?但我敢打赌,确实如此。
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