在我的应用程序中,通过称为分配的模型,设置列表包含许多歌曲,反之亦然。在我的表单中,我希望用户能够通过创建新分配从现有库中选择歌曲以添加到设置列表中。我遇到的问题是我想使用多选框,但无论我在其中选择哪首歌曲,歌曲 ID 在保存时都会设置为 1。我目前的表格如下:
<div>
<%=nested_form_for @allocation do|builder|%>
<%=builder.label :song_id, "Pick a song" %>
<%= builder.hidden_field :setlist_id, value: @setlist.id %>
<%= builder.select(:song_id, options_for_select(@selections),
{}, {multiple: true, size: 7}) %>
<%= link_to "Cancel", setlist_path(@setlist), class: "btn btn-large btn-danger" %>
<%=builder.submit "Add Song", class: "btn btn-large btn-primary", id: "addSongToSet" %>
<% end %>
</div>
如果我将“:html”添加到多选框,则此表单可以正常工作,即:
<%= builder.select(:song_id, options_for_select(@selections),
{}, html: {multiple: true, size: 7}) %>
但这随后会将表单更改回单个下拉框。
当我尝试使用多选框时呈现的 html 是:
<select id="allocation_song_id" multiple="multiple" name="allocation[song_id][]" size="8">
<option value="1">...</option>
<option value="2">...</option>
我知道问题在于 name="allocation[song_id][]" 的行,它似乎传递了一个空值的散列。我只是不知道如何在使用多选框时解决这个问题。
通过以下方式在控制器中找到@selections:
@selections = Song.all.collect {|s| [ [s.title, s.artist].join(" by "), s.id] }
提前感谢您的帮助。