Come faccio a impostare un ID univoco per le caselle in una multi-record Guide di forma?
-
13-09-2019 - |
Domanda
Ho impostato una Rotaie di forma approssimativamente seguendo le istruzioni questo Railscast.
Ecco il codice per il modulo:
<% 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 %>
Ed ecco il codice per il todo parziale:
<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>
Funziona alla grande, ma sto cercando di iniziare l'implementazione di AJAX e ho bisogno di ogni casella di controllo per avere un id univoco.Ora, il tag input generato un aspetto simile a questo:
<input id="todo_ids_" name="todo_ids[]" type="checkbox" value="7" />
Ogni casella di controllo ha lo stesso id ("todo_ids_"), che è un problema.Ho il sospetto che la soluzione è imbarazzante semplice, ma io non sto vedendo.Qualche consiglio?
Soluzione 2
Ho finito per usare una soluzione simile a Ryan, ma come ho scritto nel commento che ho dovuto fare un ulteriore cambiamento.Nella forma:
<%= check_box_tag "todo_ids[#{todo.id}]", todo.id %>
Nell'azione chiamato dal modulo:
Todo.update_all(["completed_at = ?", Time.now], :id => params[:todo_ids].keys)
Nota il "params[:todo_ids].i tasti" alla fine, che era una soluzione per affrontare lo strano modo in cui i parametri sono stati formattati:
"todo_ids" => {"5"=>"5"}
Altri suggerimenti
<%= check_box_tag "todo_ids[]", todo.id, false, :id => "todo_id_#{todo.id}" -%>
o quello che volete l'id sia.
considero questo un bug con check_box_tag causata dalla natura apparentemente hacker di dare manualmente le todo_ids nome [] e il codice del metodo chiamante sanitize_to_id (nome). Ho appena incontrato ieri e sto contemplando una patch.
Si può provare questo e farci sapere se funziona:
check_box_tag "todo_ids[#{todo.id}]", todo.id %>
Questo è il comportamento previsto di check_box_tag
, come questo commento su una correzione respinto spiega .
È possibile utilizzare collection_check_boxes
come questo ( Haml la sintassi, sorry):
# 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
Naturalmente è possibile utilizzare parziali all'interno del blocco, basta passare e utilizzare il generatore interno.