Как мне установить уникальный идентификатор для флажок в форме нескольких рекордов?
-
13-09-2019 - |
Вопрос
Я настроил образу с рельсов, примерно следовать инструкциям в это Railscast.
Вот код для формы:
<% form_tag complete_todos_path, :method => :put do %>
<ul>
<div id="incomplete_todos">
<% @incomplete_todos.each do |todo| %>
<%= render :partial => todo %>
<% end %>
</div>
</ul>
<%= submit_tag "Mark as completed" %>
<% end %>
А вот код для частичного TODO:
<div class="todo">
<li>
<%= check_box_tag "todo_ids[]", todo.id %>
<%=h todo.name %>
<%= link_to 'edit', edit_todo_path(todo) %>
<%= link_to 'delete', todo, :confirm => 'Are you sure?', :method => :delete %>
</li>
</div>
Это отлично работает, но я собираюсь начать внедрять Ajax, и мне нужен каждый флажок, чтобы иметь уникальный идентификатор. Прямо сейчас сгенерированные входные теги выглядят примерно так:
<input id="todo_ids_" name="todo_ids[]" type="checkbox" value="7" />
Каждый флажок имеет одинаковый идентификатор ("todo_ids_"), что является проблемой. Я подозреваю, что решение смущающе простое, но я его не вижу. Какие-нибудь советы?
Решение 2
В итоге я использовал решение, похожее на Райана, но, как я писал в комментарии, мне пришлось внести дальнейшие изменения. В виде:
<%= check_box_tag "todo_ids[#{todo.id}]", todo.id %>
В действии, называемом формой:
Todo.update_all(["completed_at = ?", Time.now], :id => params[:todo_ids].keys)
Обратите внимание на «params [: todo_ids] .keys» в конце, что было обходным путем, чтобы справиться с нечетным способом, которым были отформатированы параметры:
"todo_ids" => {"5"=>"5"}
Другие советы
<%= check_box_tag "todo_ids[]", todo.id, false, :id => "todo_id_#{todo.id}" -%>
Или как вы хотите, чтобы идентификатор был.
Я считаю, что это ошибка с Check_Box_TAG, вызванной, казалось бы, хакерской природой вручную даю ему имя TODO_IDS [] и код метода, вызывая Sanitize_TO_ID (имя). Я только что столкнулся с этим вчера, и я обдумываю патч.
Можете ли вы попробовать это и сообщить нам, если это работает:
check_box_tag "todo_ids[#{todo.id}]", todo.id %>
Это ожидаемое поведение check_box_tag
, в качестве Этот комментарий к отклоненному исправлению объясняет.
Вы можете использовать collection_check_boxes
как это (хэмл Синтаксис, извините):
# Accumulate todos in a params hash like { todos: { to_complete: [] } }
= collection_check_boxes(:todos, :to_complete, @incomplete_todos, :id, :name) do |todo_builder|
= todo_builder.label do
# This is the result of calling :name on the todo, as specified
# calling the helper
= todo_builder.text
= todo_builder.check_box
Конечно, вы можете использовать частичные внутри блока, просто пропустите и используйте строитель внутри.
Проверьте больше вариантов в API документы.