【问题标题】:Rails nested model validation issueRails 嵌套模型验证问题
【发布时间】:2015-12-28 14:14:12
【问题描述】:

我有以下包含一些验证的收件人模型(为了简单起见,只显示前 2 个):

 class Recipient < ActiveRecord::Base
  belongs_to :offer
  belongs_to :offer_acceptance
  validates :name, presence: true
  validates :aba_transit_number, presence: true, aba_checksum: true, format: { with: /\A((0[0-9])|(1[0-2])|(2[1-9])|(3[0-2])|(6[1-9])|(7[0-2])|80)([0-9]{7})\Z/, message: "has an invalid format" },  if: "to_usd?"

  def belongs_to_offer?
    #Check if recipient is from offer
    offer_id != nil && offer_acceptance_id == nil
  end

  def to_usd?
    (belongs_to_offer? && offer && offer.currency_to === "usd") || (!belongs_to_offer? &&  offer_acceptance && offer_acceptance.offer.currency_from === "usd")
  end
...

这是优惠模式

class Offer < ActiveRecord::Base
  has_one :recipient
  accepts_nested_attributes_for :recipient
  validates_associated :recipient
  ....

如您所见,aba_transit_number 验证仅在 recipient.offer.currency_to === "usd" 时发生。 当我像这样在控制台上创建新收件人时,验证工作正常:

o = Offer.create!(currency_to: "usd")
r = Recipient.create!(offer: o, name:"John")
ActiveRecord::RecordInvalid: Validation failed: Aba transit number can't be blank, Aba transit number has an invalid format, ...

但是当我从嵌套表单中尝试此操作时,对收件人进行的唯一验证是名称验证。我认为原因是 to_usd? 返回 false 因为由于尚未创建报价,因此没有报价 ID 或报价接受 ID。

有没有办法让 Recipient 模型知道记录是由一个 offer 保存的,例如 currency_to 设置为“usd”?也就是说,嵌套形式创建时,父属性可以传递给子模型吗?

【问题讨论】:

  • 我之所以检查offer.currency_to 是因为有不同的验证依赖于该字段。如果该值为“USD”,则适用某些验证,如果该值为“CNY”,则适用其他验证,等等。

标签: ruby-on-rails validation nested-forms


【解决方案1】:

我发现唯一需要做的就是在 offer#create 操作上添加关联

@recipient = Recipient.new(offer_params[:recipient_attributes])
@recipient.offer = @offer

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-12
    • 1970-01-01
    • 2012-08-29
    • 1970-01-01
    相关资源
    最近更新 更多