私はsimple_formlink_to_add_fields
の fields_for を使用しており、 Ryan Bates ( Railscast ) によって提案された方法で動的にフィールドを追加しています。
私が抱えている問題は、
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;DR:
無事に交換できますか
f.object.class.reflect_on_association(association).klass.new
と
f.object.send(association).build
問題なく?