gpt4 book ai didi

ruby-on-rails - 使用 parent.send(association).build 而不是 reflect_on_association(association).klass.new 动态添加嵌套字段

转载 作者:行者123 更新时间:2023-12-04 02:45:08 24 4
gpt4 key购买 nike

我正在使用 simple_form的 fields_for 并使用 Ryan Bates ( Railscast ) 提出的 link_to_add_fields 方法动态添加字段。

我的问题是

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

用于为附加字段实例化模型,它创建了一个完全空的记录(未设置 order_id),因此我的委托(delegate)方法导致错误。

如果你改为使用

发送(: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) 方式的其他内容?

长话短说:

我可以安全地更换吗

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

f.object.send(association).build

没有问题?

最佳答案

Why does Ryan Bates use

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

to instantiate the model?

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

所以

Can I safely replace

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

with

f.object.send(association).build

without problems?

是的,你可以。

关于ruby-on-rails - 使用 parent.send(association).build 而不是 reflect_on_association(association).klass.new 动态添加嵌套字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18980282/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com