2009-06-14 9 views
2

Ich habe ein Rails-Formular nach den Anweisungen in this Railscast eingerichtet.Wie lege ich eine eindeutige ID für Checkboxen in einem Multi-Record-Rails-Formular fest?

Hier ist der Code für das Formular:

<% 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 %> 

Und hier ist der Code für die To-do-Teil:

<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> 

Es ist großartig zu arbeiten, aber ich bin auf der Suche Umsetzung AJAX zu starten und ich brauche Jedes Kontrollkästchen hat eine eindeutige ID. Gerade jetzt, erzeugt die Eingangs-Tags wie folgt aussehen:

<input id="todo_ids_" name="todo_ids[]" type="checkbox" value="7" /> 

Jedes Kontrollkästchen hat die gleiche ID („todo_ids_“), das ist ein Problem. Ich vermute, dass die Lösung peinlich einfach ist, aber ich sehe es nicht. Irgendwelche Tipps?

Antwort

2

Ich endete mit einer Lösung ähnlich wie Ryans, aber wie ich in dem Kommentar schrieb, musste ich eine weitere Änderung vornehmen. In der Form:

<%= check_box_tag "todo_ids[#{todo.id}]", todo.id %> 

In der Aktion durch die Form genannt:

Todo.update_all(["completed_at = ?", Time.now], :id => params[:todo_ids].keys) 

Beachten Sie die "params [: todo_ids] .keys" am Ende, die eine Abhilfe befassen sich mit der ungeraden war Art und Weise wurden die Parameter formatiert:

"todo_ids" => {"5"=>"5"} 
1

Können Sie dies versuchen und lassen Sie uns wissen, ob es funktioniert:

check_box_tag "todo_ids[#{todo.id}]", todo.id %> 
+0

generiert die folgende: Die ids alle einzigartig sind, das ist toll, aber es sendet die Parameter in einer seltsamen Art und Weise: todo_ids "=> {" 5 "=>" 5 "} ich am Ende mit: Todo.update_all ([" completed_at = „, Time.now?]: id => params [: todo_ids] .keys) als Workaround und es funktioniert gut (obwohl es wie eine Art chaotische Lösung scheint). Danke! –

+0

Sie sollten params [: todo_ids] .keys.collect (&: to_i) verwenden Ich bin froh, dass es funktioniert hat. –

7

<%= check_box_tag "todo_ids[]", todo.id, false, :id => "todo_id_#{todo.id}" -%> oder was auch immer Sie die ID zu sein.

Ich betrachte dies als einen Fehler mit check_box_tag, der durch die scheinbar hackische Art verursacht wurde, den Namen todo_ids [] und den Methodencode, der den Namen sanitize_to_id (name) aufruft, manuell anzugeben. Ich bin gestern reingerannt und denke über einen Patch nach.

+0

Dies scheint nicht richtig zu funktionieren. Ich bekomme am Ende Eingabe-Tags wie die folgenden: Das Formular funktioniert noch, aber jede Eingabe ist standardmäßig abgehakt. –

+1

Damit dies funktioniert, müssen Sie den geprüften Parameter vor den Hash-Parametern angeben. Beim Aufruf von check_box_tag ("todo_ids []", todo.id, false,: id => "todo_id _ # {todo.id}" erhalten Sie: Vincent

+0

funktioniert perfekt für mich! – coderuby

0

Dies ist das erwartete Verhalten von , wie this comment on a rejected fix explains.

Sie können collection_check_boxes wie diese (haml Syntax, sorry) verwenden:

# 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 

Natürlich können Sie partials innerhalb des Blocks verwendet werden, nur innerhalb der Builder übergeben und verwenden.

Überprüfen Sie weitere Optionen in der API docs.

Verwandte Themen