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?

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top