первый элемент в массиве из нескольких collection_select всегда пуст

соответствующая часть новой формы выглядит следующим образом:

  <%= f.fields_for :event_artists do |fea| %>
    <%= fea.collection_select :artist_id, Artist.all, "id", "name", {include_blank: true}, {multiple: true} %>
  <% end %>

в логе видно, что первый элемент массива всегда пустой, даже если я не выбирал пустое поле

"event_artists_attributes"=>{"0"=>{"artist_id"=>["", "2", "5"]}}}

есть ли способ исправить это? возможно, сделать так, чтобы, если выбрано пустое поле, в этом случае не могли быть выбраны фактические event_artists, и наоборот?


person sivanes    schedule 21.07.2016    source источник


Ответы (2)


Пустой artist_id важен. В другой форме вы, возможно, вообще пропустили выбор исполнителя, и в этом случае ассоциация artists не должна быть затронута.

Если выбор исполнителя включен, и вы отменяете выбор всех исполнителей, исполнителей необходимо удалить из ассоциации artists. Обычное поведение HTML вообще не включает параметр artist_id в PUT, если ничего не выбрано. Ваш контроллер в этом случае будет думать, что вы вообще не хотите изменять ассоциацию artists.

Чтобы решить эту проблему, collection_select включает скрытое поле с пустым значением, чтобы сообщить контроллеру, что форма намеревается изменить ассоциацию artists. Если исполнители не выбраны, этот пустой элемент в массиве гарантирует, что все исполнители будут удалены из ассоциации.

person Sam Coles    schedule 22.07.2016
comment
так что, резюмируя, это нормально и исправить нечего? - person sivanes; 22.07.2016
comment
Да, это резюме. - person Sam Coles; 22.07.2016

Я думаю, что проблема связана с порядком аргументов. Я просмотрел collection_select и попробовал следующий код в приложении, над которым я работаю. .

<%= collection_select(:category, :category_id, Category.all, :id, :name, {}, {multiple: true}) %>

ОБНОВЛЕНИЕ:

<%= fea.collection_select :artist_id, Artist.all, "id", "name", {prompt: true}, {multiple: true} %>
person Greg Answer    schedule 21.07.2016
comment
установка его в false ничего не изменила, все равно первый элемент пуст - person sivanes; 22.07.2016
comment
Я не думаю, что это все. аргумент :artist не нужен, потому что об этом должна позаботиться строка f.fields_for :event_artists do |fea|. и я хочу иметь поле банка, поэтому мне нужно это в первых фигурных скобках. - person sivanes; 22.07.2016
comment
Я немного погуглил и думаю, что вы могли бы попробовать заменить {include_blank: true} на {prompt: true} или {prompt: 'Select event artists'}, если вам ни при каких обстоятельствах не нужно пустое поле. Я отредактирую свой ответ, чтобы отразить это. - person Greg Answer; 22.07.2016