and*_*ndi 5 activerecord nested ruby-on-rails nested-forms
我试图覆盖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 %>
Run Code Online (Sandbox Code Playgroud)
问题是:reject_if似乎没有做到这一点.无论值has_shipping_address是什么,save仍然在嵌套上调用该方法ShippingAddress,从而导致验证错误.
我在这里做错了吗?这有点令人沮丧.
and*_*ndi 10
事实证明这:reject_if没有用,因为我正在构建嵌套shipping_address在after_initialize订单的回调中.将其移动到view(或辅助方法)后,它按预期工作.
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 %>
Run Code Online (Sandbox Code Playgroud)
我希望至少这对其他人也有帮助,因为我一直很难以理解.
| 归档时间: |
|
| 查看次数: |
5249 次 |
| 最近记录: |