繁体   English   中英

Rails 4.2在js.erb中渲染数组会导致崩溃

[英]Rails 4.2 rendering an Array in js.erb results in a crash

因此,我正在尝试在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文件。 在此文件中,我有以下代码:

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

@invoicesActiveRecord::Relation时,JavaScript代码将正常执行。 如果params[:approved]不为空,则会出现问题。 reject方法过滤我不需要的对象,但是将@invoices作为Array返回。 当它是Array ,JavaScript代码根本不会执行。 我什至没有出错。

因此,结论是:为什么当我将ActiveRecord::Relation传递给js.erb以便可以呈现时,我的JavaScript代码正常工作,而当我通过Array时却没有起作用?

我进行了很多搜索,但没有找到答案。 对不起,英语不好。 随时纠正我。

提前致谢。

我找出问题所在。 在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方法。 引起所有问题的原因是.sum是仅ActiveRecord::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 %>

更改后,我的代码可以正常工作。

尝试将其呈现为集合:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM