2009-06-08 10 views
8

Ich mache eine einfache To-Do-Liste Anwendung, um mich Ruby on Rails zu lehren, aber ich habe ein Problem festgestellt. Ich habe eine einfache Form, die links von ihnen mit einem Kontrollkästchen To-do-Artikel auflistet, und eine Schaltfläche „Aktualisieren“ am unteren Rand, wie so:Wie bearbeite ich mehrere Datensätze in einem Ruby on Rails-Formular?

[] Haben die Gerichte
[] Nehmen Sie die Müll
[] die Welt übernimmt
(Update)

Jede To-do-Artikel ist ein separater Datensatz in der Datenbank mit einem "abgeschlossen" boolean Feld. Ich möchte, dass das Formular eine Liste abgefragelter Artikel-IDs an eine Aktion sendet, in der ich das Feld "Abgeschlossen" jedes Elements auf "True" setzen kann, wodurch sie aus der Ansicht ausgeblendet werden.

Ich weiß, wie man ein Formular erstellt, das mehrere Modelle referenziert, aber nicht eines, das mehrere Datensätze desselben Modells referenziert. Irgendwelche Tipps?

Danke!

+1

können Sie Ihren aktuellen Controller-Code posten? – csexton

+0

Ich habe noch keine; Ich denke immer noch konzeptionell darüber nach, wie ich das Formular einrichten würde, um die Daten an den Controller zu übergeben. –

Antwort

25

Railscasts ist dein Freund!

http://railscasts.com/episodes/52-update-through-checkboxes

Es ist wirklich einfach:

# routes.rb 
map.resources :tasks, :collection => { :complete => :put } 

# tasks_controller.rb 
def complete 
    Task.update_all(["completed_at=?", Time.now], :id => params[:task_ids]) 
end 

# views\tasks\complete.html.erb 
<% form_tag complete_tasks_path, :method => :put do %> 
    <ul> 
    <% for task in @incomplete_tasks %> 
    <li> 
     <%= check_box_tag "task_ids[]", task.id %> 
     <%= task.name %> 
    </li> 
    <% end %> 
    </ul> 
    <%= submit_tag "Mark as Complete" %> 
<% end %> 
+0

Dank Luke, das scheint wie das was ich suche. –

+0

schöner Code, einfach zu lesen. – s84

+0

Sollte das Etikett nicht in einem '

1

Warum nicht eine Remote-Funktion verwenden, um die Datenbank zu aktualisieren, wenn ein Element aktiviert ist, und die Schaltfläche Update vollständig loswerden?

+0

Ich denke darüber später nach, aber ich möchte es ohne JS zuerst funktionieren lassen, da es das Debuggen um ein Vielfaches schwieriger zu machen scheint (oder zumindest ist das der Eindruck, den ich bekomme) und an diesem Punkt werde ich wahrscheinlich machen eine Tonne dummer Fehler. –

0

Da Sie die ID für jeden Datensatz beim Erstellen Ihres Formulars einschließen können, möchten Sie, dass der Controller die Elemente in Ihrem Post durchläuft und dann jeden dieser Datensätze entsprechend findet und aktualisiert.

+0

Ich denke ich sehe was du sagst; Benennen Sie jedes der Kontrollkästchen (in einem nicht-modalen form_tag-Formular) mit der ID des Aufgabenobjekts, durchlaufen Sie dann den Hash im Controller und ändern Sie die Datensätze entsprechend? Gibt es bei dieser Vorgehensweise potenzielle Probleme, die ich im Auge behalten sollte? –

2

Wow. Das ist ein Timing. Der Artikel direkt vor dieser Frage in meinem RSS-Reader ist die neueste railscast von Ryan Bates und es scheint genau das abzudecken, was du fragst.

+0

Das hat gut funktioniert, danke fürs Heads-up! –