我有一个住has_many_and_belongs_to :rooms
。房间由管理员创建,因此它们不会与Stays一起创建,因此我希望能够从给定的集合中选择房间,但我想在我的案例中使用simple_fields_for
创建自定义选择。
为了达到我想要的目的,我在我的表格中有一些代码:
= f.simple_fields_for :rooms, Room.available do |rf|
= render 'reservations/form/resource', f: rf
到目前为止,我的资源部分只有一行:= f.hidden_field :id, value: f.object.id
当我点击刷新时,我得到:
undefined method `id' for #<Room::ActiveRecord_Relation:0x007feb6f3fc2f0>
Did you mean? ids
但是当我尝试ID时,我只得到一个包含此代码的隐藏输入:
<input value="1 2 3 4 5 6 7 8 9" type="hidden" name="reservation_stay[rooms][id]" id="reservation_stay_rooms_id">
如何让它为每个房间创建输入?
答案 0 :(得分:0)
一个常见的误解是,在分配关联(将记录链接在一起)时应该使用fields_for
(或SimpleForm包裹的simple_fields_for
) - 只有在使用accepts_nested_attributes
时才会使用它以相同的形式创建或更新嵌套资源。
在Rails中从一个集合中分配关联时,你会传递一个带有数组的_ids
(rooms_ids
)参数。
例如:
Stay.first.update(room_ids: [1, 2, 3])
_ids
setter会自动创建或删除关联 - 即使它们是间接的。
这是form options helpers in Rails work的方式。
<%= f.collection_select :rooms_ids, Room.available, :id, :room_number %>
使用自定义UI获取正确参数的最简单方法是实际使用选择并隐藏它而不是使用隐藏输入。