3

私は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

問題なく?

4

1 に答える 1

4

Ryan Bates が使用する理由

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

モデルをインスタンス化するには?

コレクションのオブジェクトは.accepts_nested_attributes、フォームの作成時にコレクション要素をリンクする必要がないためです。これは後で自動的に行われます ( を使用する場合fields_for)。order.line_items.buildリンクが必要な場合は、またはを使用しても問題はないと思います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 に答える