2012-08-15 75 views
5

我想步通过与find_each检索的记录列表框。本地跳转错误没有指定的(收益率)错误的find_each

我上构图的回答我的控制器代码在这个stack overflow post,但我仍然得到一个“无座鉴于(收益率)”的错误。

我刚刚开始在Ruby和Rails,我还没有找到块和产量的,给我什么,我需要一个完全成熟的解释(许多基本的例子虽然)。

我的代码如下所示:

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 

和错误点与find_each行。

我知道我需要一个块产生,但究竟会看在这个特殊的情况下,脱离了我。

感谢您的任何建议。

+0

你忽略new_subject.save'的'的返回值。 – meagar 2012-08-15 04:32:31

回答

5

你传递给where块,无块find_each。你不能那样做。

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

它应该阅读:你需要扭转find_eachwhere这条线,因为该块被传递到最后调用的方法的顺序很重要

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

你的下一个问题是你”再试图遍历assignments,这是一个单一的分配。 find_each已经在做迭代你,传递一个分配成块的时间。此块应阅读:

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

我打算让你的主题有很多作业,因为你有你的subject_idAssignment里面的假设。如果是这样的话,写你的循环将是最后也是最正确方式:

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

你设想得很正确。谢谢你的优雅答案。 – lonC 2012-08-17 16:07:28