Как получить хеш-значения из нескольких check_box в рельсах? - PullRequest
0 голосов
/ 28 декабря 2018

У меня есть отношение N к M между несколькими элементами в моем приложении.Итак, я хочу удалить все эти отношения в форме.Чтобы сделать это, я включил в мою форму флажок и хочу передать N.id и M.id моему контроллеру.

Все нормально передаётся моему контроллеру.Но я получил ошибку при попытке получить эти значения.

    <% duplicated.each do |element|%>
      <tr id="row_user_<%=element["product_lot"].id%>">
        <td><%= check_box_tag "product_lots[]", {:bol_id => element["bill_of_lading"].id, :product_lot_id => element["product_lot"].id} %>

И в моем контроллере я получил:

selected_product_lots = params[:product_lots]

selected_product_lots.each do |element|
  logger.debug("#{element[:bol_id]}")
end    

Если я сделаю печать на моих параметрах [: product_lots], у меня будет:

["{:bol_id=>3086, :product_lot_id=>6021}"] 

ИтакЯ хочу знать, как я могу получить bol_id и product_id от каждого элемента.На данный момент я получаю сообщение об ошибке, когда я пытаюсь сделать это:

#{element[:bol_id]}"


no implicit conversion of Symbol into Integer 

1 Ответ

0 голосов
/ 28 декабря 2018

Посмотрите на API check_box_tag:

check_box_tag(name, value = "1", checked = false, options = {}) 
  • Первым аргументом является имя: в котором хранится значение, которое обычно отображается вparams
  • Второй аргумент - это значение, и оно становится строковым для создания тега html.
  • Третье - это начальное проверенное состояние
  • Наконец, параметры

Так как вы передаете объект в значение, rails вызывает .to_s для этого объектадля того, чтобы создать тег HTML.Вот почему вы получаете ошибку no implicit conversion of Symbol into Integer, потому что вы вызываете […] для строки, которая возвращает n-й символ строки.К сожалению, это не лучшее сообщение об ошибке, поскольку в нем не упоминается, что вы обращаетесь к строке, а не к хэшу, и это будет то же сообщение об ошибке для массива.Вероятно, вы захотите сериализовать значение, чтобы потом можно было его не сериализовать:

  • Попробуйте вызвать .to_json для второго аргумента.Это должно изменить ваше значение в params[:product_lots] на ['{"bol_id": 3086, "product_lot_id": 6021}'].
  • Обратите внимание, что это все еще строка, поэтому вам нужно десериализовать ее (хотя есть вероятность, что рельсы могут автоматически десериализовать это, в зависимости от конфигурации, фильтров и т. Д.).
  • попробуйте params[:product_lots].map!{|data| JSON.parse(data, object_class: HashWithIndifferentAccess)}.Теперь это должно дать вам массив хэшей ( с равнодушным доступом , так что вы можете использовать символьные клавиши).(См. Также Json::parse)
  • Теперь вы можете получить значения, которые вы хотите
  • рассмотреть возможность перемещения этого в помощника, до действия / фильтра и т. Д., Чтобы бытьвозможность использовать его несколько раз, потенциально для нескольких параметров
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...