rails accepts_nested_attributes_for :reject_if не работает

Я отказался от попытки переопределить параметр autosave, так как думаю, что это невозможно.
Я переместил has_shipping_address с модели Order на модель ShippingAddress, и теперь у меня есть:

#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 %>

Проблема в том, что :reject_if не справляется со своей задачей. Независимо от того, какое значение имеет has_shipping_address, метод save по-прежнему вызывается для вложенного ShippingAddress, что приводит к ошибкам проверки.

Я делаю что-то не так здесь? Это немного расстраивает.


person andi    schedule 24.06.2009    source источник


Ответы (1)


Оказывается, :reject_if не сработало, потому что я создавал вложенный shipping_address в обратном вызове after_initialize заказа. После перемещения этого для просмотра (или вспомогательного метода) он работает, как и ожидалось.

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 %>

Я надеюсь, по крайней мере, это поможет кому-то еще, так как мне было очень неприятно это выяснять.

person andi    schedule 25.06.2009