したがって、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
メソッドは呼び出されず、@invoices
はActiveRecord::Relation
です。あなたがこの方法の最後に見る通り、js.erb
ファイルをレンダリングします。このファイルの中に、私はこのコードを持っている:@invoices
がActiveRecord::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
メソッドは、私が望まないオブジェクトをフィルタリングしますが、@invoices
をArray
として返します。 Array
の場合、javascriptコードは単に実行されません。私もエラーはありません。
だから、結論:を、それがレンダリングできるように、私はjs.erbにActiveRecord::Relation
を通過するとき、私のjavascriptのコードは正常に動作し、私はArray
を通過するときになかった理由は?
私は多くを検索し、答えを見つけるのを終わらせていませんでした。悪い英語のために申し訳ありません。私を修正しても構いません。
ありがとうございます。
答えに感謝しますが、うまくいきませんでした。コレクションとしてレンダリングしようとすると、 'ActiveRecord :: Relation'と' Array'は動作しません。私はまだエラーメッセージが表示されません。 –