2009-06-08 6 views
8

Robię prostą aplikację do zrobienia listy, aby nauczyć się Ruby on Rails, jednak mam problem. Mam prosty formularz z listą rzeczy do zrobienia z polem wyboru po lewej stronie i przyciskiem "Aktualizuj" na dole, tak jak jest:Jak edytować wiele rekordów w jednym formularzu Ruby on Rails?

[] Zmywanie naczyń
[] Wyciągnij śmieci
[] Przejąć świata
(aktualizacja)

Każdy element do wykonania jest oddzielny rekord w bazie danych z „ukończone” pola logicznej. Chcę, aby formularz przesłał listę sprawdzonych identyfikatorów pozycji do działania, w którym mogę ustawić wartość pola "ukończone" dla każdego elementu na wartość true, co spowoduje ukrycie ich przed widokiem.

W jaki sposób utworzyć formularz odwołujący się do wielu modeli, ale nie taki, który odwołuje się do wielu rekordów tego samego modelu. Jakieś wskazówki?

Dzięki!

+1

Możesz opublikować aktualny kod kontrolera? – csexton

+0

Nie mam jeszcze żadnych; Nadal myślę koncepcyjnie o tym, jak przygotowałem formularz do przekazania danych do kontrolera. –

Odpowiedz

25

Railscasts jest twoim przyjacielem!

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

To naprawdę proste:

# 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

Dzięki Luke, wygląda na to, czego szukam. –

+0

piękny kod, łatwy do odczytania. – s84

+0

Czy etykieta nie powinna znajdować się wewnątrz '

1

Dlaczego nie używać funkcji zdalnej do aktualizacji bazy danych, gdy element jest zaznaczony, i całkowicie zrezygnować z przycisku aktualizacji?

+0

Zastanawiam się nad tym później, ale chcę, aby działał bez żadnego JS, ponieważ wydaje się, że debugowanie jest o wiele trudniejsze (lub przynajmniej takie wrażenie uzyskuję) i na tym etapie jestem odpowiedzialny mnóstwo głupich błędów. –

0

Ponieważ możesz dołączyć identyfikator dla każdego rekordu podczas tworzenia formularza, będziesz chciał, aby kontroler robił iteracje poprzez elementy w twoim poście, a następnie znajduj i aktualizuj odpowiednio każdy z tych rekordów.

+0

Myślę, że widzę, co mówisz; nazwać każde z pól wyboru (w niemodalnym formularzu form_tag) za pomocą identyfikatora elementu todo, a następnie powtórzyć za pomocą skrótu w kontrolerze i odpowiednio zmodyfikować zapisy? Czy w tym podejściu są potencjalne okazje, o których powinienem pamiętać? –

2

Wow. To jest pewien czas. Element znajdujący się tuż przed tym pytaniem w moim czytniku RSS jest najnowszym railscast od Ryana Batesa i wydaje się, że dokładnie pokrywa to, o co prosisz.

+0

To się ładnie udało, dzięki za heads-up! –