2017-10-07 75 views
0

我有一個逗留其中has_many_and_belongs_to :rooms。房間是由管理員創建的,所以他們不會隨着住宿而創建,因此我希望能夠從給定的收藏中選擇房間,但我想使用simple_fields_for在我的情況下創建自定義外觀選擇。Rails自定義選擇部分集合

我在我的形式,以部分的代碼來實現我想要什麼:

= 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 

但是當我嘗試IDS我只得到一個隱藏的輸入具有此代碼: <input value="1 2 3 4 5 6 7 8 9" type="hidden" name="reservation_stay[rooms][id]" id="reservation_stay_rooms_id">

如何讓它爲每個房間創建輸入?

回答

0

一個常見的誤解是,fields_for(或SimpleForm包裹simple_fields_for)應分配協會(鏈接記錄在一起)時,可使用 - 它僅僅是相關的,如果你正在使用accepts_nested_attributes創建或以相同的形式更新嵌套的資源。

當從Rails中的集合分配關聯時,您將一個_idsrooms_ids)參數傳遞給一個數組。

例如:

Stay.first.update(room_ids: [1, 2, 3]) 

_ids二傳手自動創建或刪除協會 - 即使是間接的。

那是怎麼回事form options helpers in Rails work

<%= f.collection_select :rooms_ids, Room.available, :id, :room_number %> 

與自定義UI,以獲得正確的PARAMS最簡單的方法是實際使用select和隱藏它,而不是使用一個隱藏的輸入。

+0

感謝您的回答,現在我明白了,但我有相關的問題。如果我想在與Stay保持聯繫時更改房間狀態,那該怎麼辦? – Gregg

+0

你需要重新思考你是如何建模的。如果您在創建預定時在哪裏更改房間表上的狀態,即使預留了一個月,它也會鎖定房間。相反,您希望使用'has_many:through'並將預留的日期存儲在連接表中。我將它設置爲Booking has_many Reservations。預訂屬於房間。但這真是一個單獨的問題。 – max

+0

如果你搜索一下,有很多軌道預訂應用程序的例子。 – max