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-Purchaseself.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