2012-08-15 8 views
5

Ich versuche, durch eine Liste von Datensätzen, die mit find_each abgerufen werden.Lokaler Sprung Fehler Kein Block gegeben (Ausbeute) Fehler auf find_each

Ich gemustert meine Controller-Code auf die Antwort in diesem stack overflow post, aber ich bekomme immer noch eine "No Block Given (Yield)" -Fehler.

Ich beginne gerade in Ruby and Rails und ich habe noch keine vollständige Erklärung (viele grundlegende Beispiele) von Blöcken und Ausbeute gefunden, die mir gibt, was ich brauche.

Mein Code sieht wie folgt aus:

def select_save 
    @class = params[:class] 
    @student_id = params[:id] 
    @class.each do |id| 
     old_subject = Subject.find(id) 
     new_subject = old_subject.dup 
     new_subject.student_id = @student_id 
     new_subject.save 
     Assignment.find_each.where(:subject_id => id) do |assignments| 
     assignments.each do |a| 
      new_assignment = a.dup 
      new_assignment.subject_id = new_subject.id 
      new_assignment.save 
     end 
     end 
    end 

    respond_to do |format| 
     format.html { redirect_to @student, :notice => 'Subject and assignments created.' } 
    end 
    end 

und die Fehlerpunkte auf der Linie mit find_each.

Ich weiß, ich brauche einen Block zu ergeben, aber wie genau das in diesem speziellen Fall aussehen würde, entgeht mir.

Vielen Dank für Anregungen.

+0

Sie ignorieren den Rückgabewert von 'new_subject.save'. – meagar

Antwort

5

Sie übergeben einen Block an where und keinen Block an find_each. Das kannst du nicht tun. Sie müssen find_each und where auf dieser Linie umgekehrt ist die Reihenfolge wichtig, da der Block zur letzten Methode aufgerufen geben wird:

Assignment.find_each.where(:subject_id => id) do |assignments| 

Es sollte lesen:

Assignment.where(:subject_id => id).find_each do |assignments| 

Ihr nächstes Problem ist, Sie‘ versuchen, über assignments zu iterieren, die eine einzelne Zuordnung ist. find_each macht bereits die Iteration für Sie und übergibt eine Zuweisung gleichzeitig in den Block. Der Block sollte lauten:

Assignment.where(:subject_id => id).find_each do |assignment| 
    new_assignment = assignment.dup 
    new_assignment.subject_id = new_subject.id 
    new_assignment.save 
end 

Ich werde die Annahme machen, dass Ihr Thema viele Aufgaben hat, da Sie eine subject_id in Ihrem Assignment Klasse. Wenn dies der Fall ist, der letzte und richtige Weg, um Ihre Schleife zu schreiben wäre:

old_subject.assignments.each do |assignment| 
    new_assignment = assignment.dup 
    new_assignment.subject_id = new_subject.id 
    new_assignment.save 
end 
+0

Ihre Annahme war genau richtig. Danke für die elegante Antwort. – lonC

Verwandte Themen