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.