我正在使用simple_form的 fields_for 并使用 Ryan Bates ( Railscastlink_to_add_fields
)提出的方法动态添加字段。
我遇到的问题是
f.object.class.reflect_on_association(association).klass.new
,用于实例化附加字段的模型,创建一个完全空的记录(未设置 order_id),因此我的委托方法导致错误。
如果您改为使用
send(:line_items).build
要实例化新记录,它已经有父id
集:
# order.rb
class Order < ActiveRecord::Base
has_many :line_items
def price_currency
"USD"
end
end
# line_item.rb
class LineItem < ActiveRecord::Base
belongs_to :order
delegate :price_currency, :to => :order
end
# rails console
> order = Order.last # must be persisted
> line_item1 = order.class.reflect_on_association(:line_items).klass.new #=> #<LineItem id: nil, order_id: nil, created_at: nil, updated_at: nil>
> line_item2 = order.send(:line_items).build #=> #<LineItem id: nil, order_id: 1, created_at: nil, updated_at: nil>
> line_item1.price_currency #=> RuntimeError: LineItem#price_currency delegated to order.price_currency, but order is nil
> line_item2.price_currency #=> "USD"
我的问题:为什么 Ryan Bates 使用
f.object.class.reflect_on_association(association).klass.new
实例化模型?是在使用#send
不好的东西,还是我错过了其他东西send(association)
?
TL;博士:
我可以节省地更换
f.object.class.reflect_on_association(association).klass.new
和
f.object.send(association).build
没有什么问题?