Comment puis-je configurer un identifiant unique pour les cases à cocher dans un formulaire multi-enregistrement Rails?
-
13-09-2019 - |
Question
J'ai mis en place un Rails à peu près sous la forme qu'il suit les instructions ce Railscast.
Voici le code pour la forme:
<% 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 %>
Et voici le code de la todo partielle:
<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>
Il fonctionne très bien, mais je suis à la recherche de commencer à appliquer AJAX et je dois chaque case pour avoir un identifiant unique. En ce moment, les balises d'entrée générées ressembler à quelque chose comme ceci:
<input id="todo_ids_" name="todo_ids[]" type="checkbox" value="7" />
Chaque case à cocher a le même identifiant ( « todo_ids_ »), qui est un problème. Je pense que la solution est honteusement simple, mais je ne le vois pas. Des conseils?
La solution 2
J'ai fini avec une solution similaire à Ryan, mais comme je l'ai écrit dans le commentaire que je devais faire un autre changement. Sous la forme:
<%= check_box_tag "todo_ids[#{todo.id}]", todo.id %>
Dans l'action appelée par la forme:
Todo.update_all(["completed_at = ?", Time.now], :id => params[:todo_ids].keys)
Notez les « params [: todo_ids] .keys » à la fin, ce qui était une solution pour faire face à la manière bizarre les paramètres ont été formatés:
"todo_ids" => {"5"=>"5"}
Autres conseils
<%= check_box_tag "todo_ids[]", todo.id, false, :id => "todo_id_#{todo.id}" -%>
ou tout ce que vous voulez que l'identifiant soit.
Je considère cela comme un bug avec check_box_tag causé par la nature apparemment hackish de donner manuellement le nom todo_ids [] et le code de la méthode appelant sanitize_to_id (nom). Je viens de croiser hier et je contemple un patch.
Pouvez-vous essayer cela et laissez-nous savoir si cela fonctionne:
check_box_tag "todo_ids[#{todo.id}]", todo.id %>
Ceci est le comportement attendu de check_box_tag
, comme ce commentaire sur un correctif rejeté explique .
Vous pouvez utiliser collection_check_boxes
comme ça ( haml syntaxe, désolé):
# 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
Bien sûr, vous pouvez utiliser partials l'intérieur du bloc, juste passer et utilisez le générateur à l'intérieur.
Vérifiez plus d'options dans l'API docs .