1

したがって、js.erbファイル内のオブジェクトの配列をレンダリングしようとしています。配列を作成するコントローラーメソッドは次のようになります。Rails 4.2でjs.erbで配列をレンダリングするとクラッシュする

def process_report 
    start_date = Date.parse(params[:start_date]) 
    finish_date = Date.parse(params[:finish_date]) 
    done = params[:done].to_i 
    kind = params[:kind].to_i 
    late = to_boolean params[:late] 
    @invoices = Invoice.where(due_date: start_date..finish_date, 
          done: done, 
          kind: kind, 
          late: late) 
    if params[:approved] != "" 
    @invoices = @invoices.reject{ |i| i.status.description != params[:approved] } 
    end 
    render 'complete_report.js.erb', 
     collection: @invoices, format: :js, status: :ok 
end 

このコードはちょっと醜いです。私はそれをリファクタリングするつもりです。したがって、ビューにparams[:approved]が渡された場合、私はコレクションからいくつかのオブジェクトを拒否します。ビューがこのパラメータを渡さなかった場合、rejectメソッドは呼び出されず、@invoicesActiveRecord::Relationです。あなたがこの方法の最後に見る通り、js.erbファイルをレンダリングします。このファイルの中に、私はこのコードを持っている:@invoicesActiveRecord::Relationとき

<% @invoices.each do |invoice| %> 
    var tableLine = $("<%= escape_javascript (render partial: 'invoice', locals: {invoice: invoice}, formats: :html) %>"); 
    $("#report_invoice_table").append(tableLine); 
<% end %> 

をjavascriptのコードが正常に実行されます。 params[:approved]が空でない場合、問題が発生します。 rejectメソッドは、私が望まないオブジェクトをフィルタリングしますが、@invoicesArrayとして返します。 Arrayの場合、javascriptコードは単に実行されません。私もエラーはありません。

だから、結論:を、それがレンダリングできるように、私はjs.erbにActiveRecord::Relationを通過するとき、私のjavascriptのコードは正常に動作し、私はArrayを通過するときになかった理由は?

私は多くを検索し、答えを見つけるのを終わらせていませんでした。悪い英語のために申し訳ありません。私を修正しても構いません。

ありがとうございます。

答えて

1

私は問題を見つけます。 js.erbファイルには、請求書のレンダリング後にすべての請求書の合計を計算するコードがあります。

<% @invoices.each do |invoice| %> 
    <% puts invoice.inspect %> 
    var tableLine = $("<%= escape_javascript (render partial: 'invoice', 
    locals: {invoice: invoice}, formats: :html) %>"); 
    $("#report_invoice_table").append(tableLine); 
<% end %> 

<% if @invoices.empty? %> 
    $("#report_total_value").css("display", "none"); 
<% else %> 
    $("#report_total_value").css("display", "inline-block"); 
    $("#report_total_value").text("Total: R$ " + <%= @invoices.sum(:value) %>); 
<% end %> 

ご覧のとおり、私は.sumメソッドを使用しています。 .sumActiveRecord::Relationでしか利用できないため、この問題はすべて発生しています。 Arrayクラスでは、別の方法を使用する必要があります。

<% @invoices.each do |invoice| %> 
    <% puts invoice.inspect %> 
    var tableLine = $("<%= escape_javascript (render partial: 'invoice', 
    locals: {invoice: invoice}, formats: :html) %>"); 
    $("#report_invoice_table").append(tableLine); 
<% end %> 

<% if @invoices.empty? %> 
    $("#report_total_value").css("display", "none"); 
<% else %> 
    $("#report_total_value").css("display", "inline-block"); 
    $("#report_total_value").text("Total: R$ " 
    + <%= @invoices.map{ |i| i.value }.reduce(0, :+) %>); 
<% end %> 

変更後、私のコードは正常に動作します。

0

は、コレクションとしてそれをレンダリングするために試してみてください。

var tableLine = $("<%= j render(partial: 'invoice', collection: @invoices, formats: :html) %>"); 
$("#report_invoice_table").append(tableLine); 
+0

答えに感謝しますが、うまくいきませんでした。コレクションとしてレンダリングしようとすると、 'ActiveRecord :: Relation'と' Array'は動作しません。私はまだエラーメッセージが表示されません。 –

関連する問題