update rails how form for fields_for example accepts_nested_attributes_for ruby-on-rails activerecord nested nested-forms

ruby on rails - how - rails accepts_nested_attributes_for: reject_if no funciona



rails update nested attributes (1)

autosave anular el parámetro de autosave porque creo que no se puede hacer.
has_shipping_address el has_shipping_address de Order al modelo ShippingAddress y ahora tengo:

#the models.. class Order < ActiveRecord::Base belongs_to :billing_address belongs_to :shipping_address accepts_nested_attributes_for :billing_address accepts_nested_attributes_for :shipping_address, :reject_if => proc { |attributes| attributes["has_shipping_address"] != ''1'' } def after_initialize self.build_billing_address unless billing_address self.build_shipping_address unless shipping_address end end class ShippingAddress < OrderAddress attr_accessor :has_shipping_address end class OrderAddress < ActiveRecord::Base validates_presence_of :name #more validations here.. end #the view <% form_for @order do |f| %> #... <% f.fields_for :shipping_address do |addr_f| %> <%= addr_f.check_box :has_shipping_address %> <%= addr_f.text_field :name %> #more fields for the address.. <% end %> <% end %>

El problema es que :reject_if no parece hacer su trabajo. No importa cuál sea el valor de has_shipping_address , el método save aún se has_shipping_address en la dirección de ShippingAddress anidada, lo que da como resultado errores de validación.

¿Estoy haciendo algo mal aquí? Esto se está poniendo un poco frustrante.


Resulta que :reject_if no funcionó porque estaba construyendo la dirección de shipping_address anidada en la devolución de llamada after_initialize de la orden. Después de mover eso para ver (o un método de ayuda), funciona como se esperaba.

def after_initialize self.build_billing_address unless billing_address end #the view is now <% form_for @order do |f| %> #... <% @order.build_shipping_address unless @order.shipping_address %> <% f.fields_for :shipping_address do |addr_f| %> <%= addr_f.check_box :has_shipping_address %> <%= addr_f.text_field :name %> #more fields for the address.. <% end %> <% end %>

Espero que al menos esto también ayude a alguien más, ya que fue muy frustrante para mí descubrirlo.