Como defino um ID exclusivo para caixas de seleção em um formulário de Rails com vários registros?
-
13-09-2019 - |
Pergunta
Eu configurei uma forma de trilhos seguindo as instruções em isto Railscast.
Aqui está o código para o formulário:
<% 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 %>
E aqui está o código para o TODO Parcial:
<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>
Está funcionando muito bem, mas estou procurando começar a implementar o Ajax e preciso de cada caixa de seleção para ter um ID exclusivo. No momento, as tags de entrada geradas parecem algo assim:
<input id="todo_ids_" name="todo_ids[]" type="checkbox" value="7" />
Cada caixa de seleção tem o mesmo ID ("TODO_IDS_"), o que é um problema. Suspeito que a solução seja embaraçosamente simples, mas não estou vendo. Alguma dica?
Solução 2
Acabei usando uma solução semelhante à de Ryan, mas, como escrevi no comentário, tive que fazer uma mudança adicional. Na forma:
<%= check_box_tag "todo_ids[#{todo.id}]", todo.id %>
Na ação chamada pelo formulário:
Todo.update_all(["completed_at = ?", Time.now], :id => params[:todo_ids].keys)
Observe os "params [: TODO_IDS] .Keys" no final, que foi uma solução alternativa para lidar com a maneira ímpar dos parâmetros que foram formatados:
"todo_ids" => {"5"=>"5"}
Outras dicas
<%= check_box_tag "todo_ids[]", todo.id, false, :id => "todo_id_#{todo.id}" -%>
Ou o que você quiser que o ID seja.
Considero isso um bug com check_box_tag causado pela natureza aparentemente hackish de dar manualmente o nome TODO_IDS [] e o código do método chamando SANITIZE_TO_ID (nome). Acabei de encontrar isso ontem e estou pensando em um patch.
Você pode tentar isso e nos informar se funcionar:
check_box_tag "todo_ids[#{todo.id}]", todo.id %>
Este é o comportamento esperado de check_box_tag
, Como Este comentário sobre uma correção rejeitada explica.
Você pode usar collection_check_boxes
assim (Haml Sintaxe, desculpe):
# 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
É claro que você pode usar parciais dentro do bloco, basta passar e usar o construtor dentro.
Verifique mais opções no API Docs.