5

find_eachで取得されるレコードのリストをステップスルーしようとしています。

このスタックオーバーフローポストの回答に基づいてコントローラーコードをパターン化しましたが、それでも「No Block Gived(Yield)」エラーが発生します。

私はRubyとRailsを始めたばかりですが、必要なものを提供するブロックとyieldの本格的な説明(基本的な例はたくさんあります)をまだ見つけていません。

私のコードは次のようになります:

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の行を指しています。

私は屈服するためのブロックが必要であることを知っていますが、この特定のケースでそれがどれほど正確に見えるかは私を免れます。

提案をありがとう。

4

1 に答える 1

5

ブロックをに渡し、ブロックをに渡しwhereませんfind_each。あなたはそれをすることはできません。find_each逆にする必要がありますwhere。この行では、ブロックが最後に呼び出されたメソッドに渡されるため、順序が重要です。

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

それは読むべきです:

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

assignments次の問題は、単一の割り当てであるを反復しようとしていることです。find_eachはすでに反復を実行しており、一度に1つの割り当てをブロックに渡します。ブロックは次のようになります。

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_idクラス内にいるので、サブジェクトには多くの割り当てがあると仮定しますAssignment。この場合、ループを作成するための最後の最も正しい方法は次のようになります。

old_subject.assignments.each do |assignment|
  new_assignment = assignment.dup
  new_assignment.subject_id = new_subject.id
  new_assignment.save
end
于 2012-08-15T04:30:55.703 に答える