Rails嵌套表单,其中预定义字段为复选框

时间:2014-02-21 07:50:48

标签: ruby-on-rails ruby-on-rails-4 nested-forms nested-attributes form-helpers

我正在制作包含RoomRoomAttribute型号的酒店应用。这两个模型之间通过连接表具有many_to_many关系。每个模型的属性如下:

  • 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]) 
    

    但这不适合我。

谢谢! :)

2 个答案:

答案 0 :(得分:1)

我能够通过简单地深入研究Rails 4文档来解决它。我的Room模型的每个实例都有一个方法room_attribute_ids=。请注意,Rails将room_attributes单独化为room_attribute并为param附加了_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>

然后在控制器中我定义了一个私有方法来为嵌套属性应用强参数:

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

答案 1 :(得分:-4)

您可以在RailscastsRailsguides

中找到所需的所有建议

如果您遇到任何错误或问题,可以更新并询问。