2009-06-24 5 views
3

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

#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, что приводит к ошибкам проверки.

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

ответ

9

Выходит :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 %> 

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