У меня есть приложение Ruby on Rails 3.2.13, в котором есть инструкция collection_select. Оператор collection_select находится в операторе fields_for, где я собираю выбранные идентификаторы из collection_select и использую их для заполнения другой таблицы. Проблема, с которой я сталкиваюсь, заключается в том, что оператор collection_select добавляет запись с нулевым идентификатором в массив, в котором хранится коллекция выбранных идентификаторов.
Вот мой код на мой взгляд:
<%= f.fields_for :media_topics do |media_topic| %>
<%= media_topic.label :topic, "Topics" %><%= media_topic.collection_select(:topic_id, Topic.order("name_en"), :id, :name_en, {}, {multiple: true}) %>
<% end %>
Вот пример того, как выглядит массив после выбора двух опций:
"media_topics_attributes"=>{"0"=>{"topic_id"=>["", "2", "47"], "id"=>"1895"}}
Через другого члена Stack Overflow я узнал, что пустая запись в collection_select является скрытым значением, которое автоматически включается. В Rails 3 нет возможности не включать это поле. Однако, согласно ссылке, приведенной в ответе на мой предыдущий вопрос the-first-position-of-my-ar">Rails 3.2 - collection_select Добавление нулевой записи в первую позицию моего массива будет способ исключить это скрытое значение в Rails 4.
Я пропускал это значение и добавлял строки MediaTopic вручную, прежде чем решил использовать accepts_nested_attributes_for в первый раз. Я хочу сделать мой код контроллера чище, чем сейчас. Проблема, с которой я сталкиваюсь, заключается в том, чтобы выяснить, как пропустить эту пустую запись. Я прочитал API и многие другие сообщения о том, как я должен пропустить это значение, но ни один из них не работает.
Вот код, который у меня есть для вложенных атрибутов media_topics в моей модели MediaLibrary.
has_many :media_topics, dependent: :destroy
accepts_nested_attributes_for :media_topics, allow_destroy: true, reject_if: proc { |attributes| attributes['id'].blank? }
Модель темы в collection_select имеет поле :id, которое будет обновлять поле :topic_id в модели MediaTopic. Другое поле в MediaTopic — :media_library_id. Я попробовал поля id и topic_id в команде accepts_nested_attributes_for, но когда я делаю update_attributes для основной модели, я получаю сообщение об ошибке, говорящее, что тема не может быть пустой. Я уверен, что ошибка возникает из-за попытки создать строку MediaTopic для первой пустой записи в массиве.
Я исследовал это в течение нескольких дней, но ничего из того, что я пробовал, не работает. Я проверил API, APIDock и другие источники безрезультатно. Я хочу удалить пустую запись из media_topics_attributes до того, как сделаю update_attributes. Наверное, я не понимаю, как писать код. Я видел это в API в качестве примера, но я понятия не имею, куда это должно идти или как я должен кодировать это, чтобы избавиться от пустого значения.
params = { member: {
posts_attributes: [{ id: '2', _destroy: '1' }]
}}
Любая помощь будет оценена по достоинству.
ОБНОВЛЕНИЕ 10 августа 2013 г., 22:46 CDT
В моем контроллере у меня есть следующее предложение when в моем операторе case после завершения проверки всех ошибок.
when @media_library.update_attributes(params[:media_library])
ОБНОВЛЕНИЕ 12.08.2013, 8:20 CDT
В модели MediaLibrary я изменил свой accepts_nested_attributes_for на следующий.
accepts_nested_attributes_for :media_topics, allow_destroy: true
ОБНОВЛЕНИЕ 12 августа 2013 г., 10:50 CDT
Вот как выглядит хеш в моей отладке:
media_topics_attributes: !ruby/hash:ActiveSupport::HashWithIndifferentAccess
'0': !ruby/hash:ActiveSupport::HashWithIndifferentAccess
topic_id:
- '2'
- '47'
id: '1896'
Однако я все еще получаю сообщение об ошибке Тема тем СМИ не может быть пустой. Я буду продолжать искать.
ОБНОВЛЕНИЕ 12 августа 2013 г., 12:15 CDT
Тема — это модель со списком имен (:id, :name)
MediaLibrary — это список строк, которые я хочу выбрать по Topic.name.
MediaTopic — это список строк, которые связывают Topic с MediaLibrary.
MediaLibrary has_many :media_topics, зависимый: :destroy
Тема has_many :media_topics
MediaTopic принадлежит_к :media_library принадлежит_к :теме
Экран, над которым я работаю, будет вносить изменения в MediaLibrary и обновлять MediaTopic в зависимости от оператора collection_select, в котором перечислены имена тем.