I gave on trying to override the autosave parameter since I think it can't be done.
I moved the has_shipping_address from the Order to the ShippingAddress model and now I have:
#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 %>
The problem is that :reject_if doesn't seem to do it's job. No matter what the value for has_shipping_address is, the save method is still called on the nested ShippingAddress, resulting in validation errors.
Am I doing something wrong here? This is getting a bit frustrating.
Turns out the :reject_if didn't work because I was doing the building of the nested shipping_address in the after_initialize callback of the order. 
After moving that to view (or a helper method), it works as expected.
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 %>
I hope at least this will help someone else too, as it has been very frustrating for me to figure out.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With