ActiveAdmin 中的可选嵌套 has_one

Optional Nested has_one in ActiveAdmin

我在 Order 和 ShippingAddress 之间有一对一的关系。订单并不总是有送货地址。 AA 代码:

  f.inputs "Shipping address", for: [:shipping_address, f.object.shipping_address || ShippingAddress.new] do |shipping|
    shipping.input :firstname
    shipping.input :lastname
    shipping.input :address1
    shipping.input :address2
    shipping.input :phone
    shipping.input :country
    shipping.input :state
    shipping.input :city
    shipping.input :zip
  end

我的问题是在编辑订单时。它总是尝试创建一个新的送货地址并验证其字段 - 这些字段为空,因此在验证期间失败。除非填写了字段,否则我不想在编辑订单时创建送货地址。

您的问题不在于 AA,而在于 Rails。

你要用的是reject_if:

has_one :shipping_address,
  reject_if: -> { |attrs| attrs[:firstname].blank? } # check any attributes you want

这样可以确保 Rails 不会尝试创建不需要的关联。

这是您需要的:

  accepts_nested_attributes_for :shipping_address, reject_if: proc { |attrs| attrs[:firstname].blank? }