1

我正在做一個酒店應用程序,其中包括RoomRoomAttribute模型。這兩個模型之間通過連接表具有many_to_many關係。對於每個模型的屬性如下:Rails嵌套窗體與預定義字段作爲複選框

  • Room - room_numberroom_type(例如, 「豪華」 或 「套件」),和price
  • RoomAttributes - name(例如「無線互聯網」,「有線電視」,「浴盆」)。

用戶將首先創建一組房間屬性,以便每次創建新房間時都可以選中這些屬性作爲複選框。例如,一些房間可能有無線上網,有些則沒有。 app/views/rooms/new.html.erb的代碼是(我的使用原始HTML的道歉)。

<form action="<%= rooms_path %>" method="post"> 
    <input type="hidden" name="authenticity_token" value="<%= form_authenticity_token %>"> 

    <label for="room_number">Room Number:</label> 
    <input type="text" name="room[room_number]" id="room_number"> <br> 

    <label for="room_type">Type:</label> 
    <input type="text" name="room[room_type]" id="room_type"> <br> 

    <label for="price">Price:</label> 
    <input type="text" name="room[price]" id="price"> <br> 

    <label for="room_attributes">Attributes:</label> 
    <ul> 
    <% @room_attributes.each do |room_attribute| %> 
     <li> 
     <input type="checkbox" name="room[room_attributes_ids][]" value="<%= room_attribute.id %>"> 
     <%= room_attribute.name %> 
     </li> 
    <% end %> 
    </ul> 

    <input type="submit" value="Submit"> 
</form> 

我用Rails 4,我想請教以下幾點:

  • 使用表單助手設置形式或formtastic以便它已經輸出了所有的預定義的房間屬性和用戶可以通過複選框簡單地選擇要包含在房間中的屬性。
  • 編寫RoomController#create方法,以便它將嵌套的RoomAttribute模型設置爲房間屬性。我需要accepts_nested_attributes_for :room_attributes在我的app/models/room.rb
  • 如何在此場景中引入強參數。我讀過,我應該使用

    params.require(:room).permit(:room_number, :room_type, :price, room_attributes_attributes: [:id]) 
    

    但這不適用於我。

謝謝! :)

回答

1

我能夠通過簡單的挖掘Rails 4文檔來解決它。我的Room型號的每個實例都有一個方法room_attribute_ids=。請注意,Rails將room_attributes單數化爲room_attribute,併爲該參數附加了_ids,而我之前的實現使用了複數形式和:name_of_associated_model_attributes => [:id]約定。

因此我列出new.html.erb房間屬性如下:

<label for="room_attributes">Attributes:</label> 
<ul> 
    <% @room_attributes.each do |room_attribute| %> 
    <li> 
     <input type="checkbox" name="room[room_attribute_ids][]" value="<%= room_attribute.id %>"> 
     <%= room_attribute.name %> 
    </li> 
    <% end %> 
</ul> 

然後在控制器I定義爲施加很強的參數嵌套屬性的私有方法:

def room_params 
    params.require(:room).permit(:room_number, :room_type, :price, :room_attribute_ids => []) 
end 
-4

那麼你會發現每一個如果遇到您可以更新,並要求任何錯誤或問題,您在RailscastsRailsguides

需要諮詢。