Используйте собственный идентификатор для check_box_tag в Rails
-
23-09-2019 - |
Вопрос
Как установить собственный идентификатор при использовании помощника check_box_tag в рельсах?
У меня есть цикл, который создает кучу флажков на основе коллекции:
- subject.syllabus_references.each do |sr|
= check_box_tag 'question[syllabus_reference]', sr.id, :id => sr.id
= label_tag sr.id, sr.name
Я хотел бы установить собственный идентификатор, чтобы моя метка для флажка работала правильно, но я не могу понять, как (:id => sr.id не работает...).
Проблема также может быть в том, как я определил метку, поэтому, если я смогу заставить ее ссылаться на правильный флажок, не устанавливая собственный идентификатор, тогда это тоже будет хорошо...
Решение
Я использовал это в своем приложении для создания тегов флажков из коллекции и отправки их массива:
<% @cursos.each do |c| %>
<span class='select_curso'>
<%= check_box_tag "vaga[curso_ids][]",
c.id, (checked = true if form.object.curso_ids.include?(c.id)) %>
<%= label_tag "vaga[curso_ids][][#{c.id}]", c.nome %>
</span>
<% end %>
Итак, в параметрах у меня есть массив "curso_ids"=>["1", "3", "5"] вместо строки "curso_ids"=>"5".Если вы хотите вернуть одно значение, используйте вага[curso_id], в противном случае используйте вага[curso_ids][] чтобы вернуть массив.
Другие советы
Если вы дадите флажку дополнительный параметр, он будет работать:
= check_box_tag 'question[syllabus_reference]', 1, nil, :id => sr.id
@Ganesh, в вашем решении полученный хэш параметров имеет следующую форму:
params[:question][:syllabus_reference] = {1 => 1, 2 => 2, 3 => 3, ...}
Это должно работать лучше для вас:
check_box_tag "question[syllabus_reference][]", sr.id, checked, {:id => "question_syllabus_reference_#{sr.id}"
Обратите внимание, что для работы этого параметра необходим третий параметр (отмеченный).Результирующий массив параметров будет
params[:question][:syllabus_reference] = {1, 2, 3, ...}
Кажется, я понял это...
- subject.syllabus_references.each do |sr|
= check_box_tag "question[syllabus_reference][#{sr.id}]", sr.id
= label_tag "question[syllabus_reference][#{sr.id}]", sr.name
Это работает, но если у вас есть способ получше, дайте мне знать!
Это было очень полезно и положило конец моим многодневным поискам.Большая часть того, что я нашел до сих пор, содержала синтаксис и дополнительные параметры, которые рельсы либо помечали, либо вообще игнорировали.Все, что я хочу сделать, это передать массив из моего представления в мой контроллер и использовать флажки, чтобы сообщить контроллеру, какие элементы массива обрабатывать.Я смог еще больше сократить вышеизложенное:
<%= check_box_tag "c[]", c.id %>
где c взят из моей базы данных:
<%= @objects.each do |c| %>
Это, конечно, передает массив идентификаторов объектов моему контроллеру, относящемуся только к отмеченным записям (по умолчанию записи не отмечены, так как я пропустил :ЛОЖЬ параметр, который, кстати, дает тот же результат, что и :истинный), который почти все, что мне нужно.
Теперь мне просто нужно передать индикатор типа объекта (подойдет даже простая строка), чтобы контроллер знал, какой тип объекта он должен обрабатывать, и мне не пришлось дополнять мою модель дополнительным столбцом.Я начну с этого сейчас и опубликую свое решение, но, пожалуйста, дайте мне знать, есть ли быстрый и простой способ сделать это, если вы уже знаете.
Образец HAML
Допустим, у вас есть print
объект где-то с framed
атрибут, вам необходимо отобразить список prints
поэтому внутри цикла вы создадите собственный row
и column
с уникальным идентификатором на каждом checkbox
для обновления framed
.input.row.collapse
= check_box_tag :framed, print.framed, nil, { id: "framed_#{print.id}" }
Лейто,
Чтобы замкнуть цикл, я отказался от попытки передать индикатор типа объекта через check_box_tag.Каждый параметр, который я добавлял в синтаксис, показанный в моем последнем посте выше (ниже??), просто приводил к тому, что состояние флажка по умолчанию было установлено на проверено скорее, чем непроверенный, без передачи каких-либо дополнительных данных контроллеру.
Оставаясь внимательным к альтернативным решениям по мере их появления, на данный момент я включаю тип объекта в submit_tag ценить.Это связывает функциональность с дисплеем, поскольку submit_tag Значение — это то, что отображается пользователю на кнопке отправки, но можно утверждать, что это вносит ясность в представление, даже если обеспечивает необходимое устранение неоднозначности для контроллера.
Учимся день за днём...