3

我正在使用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

没有什么问题?

4

1 回答 1

4

为什么瑞恩贝茨使用

f.object.class.reflect_on_association(association).klass.new

实例化模型?

因为.accepts_nested_attributes集合的对象在构建表单时不需要将集合元素链接到它。这将在稍后自动发生(如果您使用fields_for)。如果您需要链接,我认为使用order.line_items.buildor没有任何问题order.send(:line_items).build

所以

我可以安全地更换吗

f.object.class.reflect_on_association(association).klass.new

f.object.send(association).build

没有什么问题?

是的你可以。

于 2013-09-24T15:27:48.770 回答