2009-06-08 10 views
8

Sto facendo una semplice applicazione to-do list per insegnare a me stesso Ruby on Rails, ma ho incontrato un problema. Ho un modulo semplice che elenca gli elementi to-do con una casella di controllo a sinistra e un pulsante "Aggiorna" in basso, in questo modo:Come posso modificare più record in un modulo Ruby on Rails?

[] Do the dishes
[] Estrarre il spazzatura
[] conquistare il mondo
(Update)

Ogni to-do elemento è un record separato nel database con un campo booleano "completato". Voglio che il modulo invii un elenco di ID elemento selezionato a un'azione in cui posso impostare il campo "completato" di ciascun elemento su true, che li nasconde dalla vista.

So come fare un modulo che fa riferimento a più modelli, ma non uno che fa riferimento a più record dello stesso modello. Qualche consiglio?

Grazie!

+1

potete inserire il vostro codice regolatore di corrente? – csexton

+0

Non ne ho ancora; Sto ancora pensando concettualmente a come andrei sulla configurazione del modulo per passare i dati al controller. –

risposta

25

Railscasts è tuo amico!

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

E 'davvero semplice:

# 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

Grazie Luca, questo sembra quello che sto cercando. –

+0

codice bello, facile da leggere. – s84

+0

L'etichetta non deve trovarsi all'interno di un '

1

perché non utilizzare una funzione remota per aggiornare il database quando un elemento è selezionata, e sbarazzarsi del pulsante di aggiornamento del tutto?

+0

Ci sto pensando in seguito, ma voglio farlo funzionare senza JS prima, dato che sembra che il debugging sia molto più difficile (o almeno è l'impressione che ottengo) ea questo punto sono responsabile un sacco di errori stupidi. –

0

Dal momento che è possibile includere l'ID per ogni record quando si crea il modulo che vorrà il controller per scorrere le voci in voi messaggio, allora trovare e aggiornare ognuno di quei dischi di conseguenza.

+0

Penso di vedere quello che stai dicendo; nominare ciascuna casella di controllo (in un modulo form_tag non modale) utilizzando l'ID dell'oggetto todo, quindi scorrere l'hash nel controller e modificare i record di conseguenza? Ci sono dei potenziali trucchi in questo approccio che dovrei tenere a mente? –

2

Wow. Questo è un po 'di tempo. L'elemento giusto prima di questa domanda nel mio lettore RSS è l'ultimo railscast di Ryan Bates e sembra coprire esattamente ciò che stai chiedendo.

+0

Ha funzionato bene, grazie per l'heads-up! –

Problemi correlati