Wie lege ich eine eindeutige ID für Kontrollkästchen in einem Rails-Formular mit mehreren Datensätzen fest?

StackOverflow https://stackoverflow.com/questions/992094

Frage

Ich habe ein Rails-Formular ungefähr nach den Anweisungen in eingerichtet Das Railscast.

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 den Todo-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 funktioniert großartig, aber ich möchte mit der Implementierung von AJAX beginnen und benötige, dass jedes Kontrollkästchen eine eindeutige ID hat.Im Moment sehen die generierten Eingabe-Tags etwa so aus:

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

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

War es hilfreich?

Lösung 2

Am Ende habe ich eine ähnliche Lösung wie die von Ryan verwendet, aber wie ich im Kommentar schrieb, musste ich eine weitere Änderung vornehmen.In der Form:

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

In der vom Formular aufgerufenen Aktion:

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

Beachten Sie die „params[:todo_ids].keys“ am Ende, die eine Problemumgehung für die seltsame Formatierung der Parameter darstellten:

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

Andere Tipps

<%= check_box_tag "todo_ids[]", todo.id, false, :id => "todo_id_#{todo.id}" -%> oder wie auch immer die ID lauten soll.

Ich halte dies für einen Fehler bei check_box_tag, der durch die scheinbar hackige Natur verursacht wird, ihm manuell den Namen todo_ids[] und den Methodencode zu geben, der sanitize_to_id(name) aufruft.Ich bin erst gestern darauf gestoßen und denke über einen Patch nach.

Können Sie das ausprobieren und uns mitteilen, ob es funktioniert:

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

Dies ist das erwartete Verhalten von check_box_tag, als Dieser Kommentar zu einem abgelehnten Fix erklärt.

Sie können verwenden collection_check_boxes so was (haml Syntax, 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

Natürlich können Sie Partials innerhalb des Blocks verwenden, übergeben Sie einfach den darin enthaltenen Builder und verwenden Sie ihn.

Weitere Optionen finden Sie im API-Dokumente.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top