Я вижу, что ваш оригинальный вопрос попросил использовать attr_accessor
, однако это не представляется возможным. Я смог заставить это работать, только удалив attr_accessor
.
Похоже, что attr_accessor
на самом деле имеет противоположное поведение - сделать атрибут недоступным вместо того, чтобы разрешить его при использовании accepts_nested_attributes_for
. Возможно, ошибка? Документы не дают никаких примеров. Пока вы делаете params.permit
на стороне контроллера, все еще безопасно использовать без attr_accessor
.
class Order
has_many :items
accepts_nested_attributes_for :items
end
class Item
belongs_to :order
end
Вызов его из консоли Rails:
@order = Order.find(1)
@order.assign_attributes({"items_attributes"=>[{"id" => 1, "discount_cents" => "234"}]})
@order.save
# Order Load (0.4ms) SELECT "orders".* FROM "orders" WHERE "orders"."id" = $1 LIMIT $2 [["id", 1], ["LIMIT", 1]]
# Item Load (0.3ms) SELECT "items".* FROM "items" WHERE "items"."order_id" = $1 AND "items"."id" = $2 [["order_id", 1], ["id", 1]]
# (0.1ms) BEGIN
# Item Update (0.3ms) UPDATE "items" SET "discount_cents" = $1 WHERE "items"."id" = $2 [["discount_cents", 234], ["id", 1]]
# => true
# (5.8ms) COMMIT
@order.assign_attributes({"items_attributes"=>[{"id" => 1, "discount_cents" => "789"}]})
# => nil
# Item Load (0.4ms) SELECT "items".* FROM "items" WHERE "items"."order_id" = $1 AND "items"."id" = $2 [["order_id", 1], ["id", 1]]
@order.items.first.attributes
# => {"order_id"=>1, "id"=>1, "discount_cents"=>789}
Надеюсь, что это даст решение вашего вопроса:)