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
方法并且 @invoices
是一个 ActiveRecord::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 %>
当 @invoices
是 ActiveRecord::Relation
时,javascript 代码正常执行。如果 params[:approved]
不为空,就会出现问题。 reject
方法过滤我不想要的对象,但 returns @invoices
作为 Array
。当它是 Array
时,javascript 代码根本不会执行。我什至没有收到错误。
所以,结论是: 为什么当我将 ActiveRecord::Relation
传递给 js.erb 以便它可以呈现时,我的 javascript 代码有效通常,当我通过 Array
?
时没有
我搜索了很多,但没有找到答案。抱歉英语不好。欢迎指正。
提前致谢。
尝试将其呈现为集合:
var tableLine = $("<%= j render(partial: 'invoice', collection: @invoices, formats: :html) %>");
$("#report_invoice_table").append(tableLine);
我找到问题了。在 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
class,则必须使用其他方法。
<% @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 %>
修改后,我的代码运行正常。
因此,我正在尝试在我的 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.each do |invoice| %>
var tableLine = $("<%= escape_javascript (render partial: 'invoice', locals: {invoice: invoice}, formats: :html) %>");
$("#report_invoice_table").append(tableLine);
<% end %>
当 @invoices
是 ActiveRecord::Relation
时,javascript 代码正常执行。如果 params[:approved]
不为空,就会出现问题。 reject
方法过滤我不想要的对象,但 returns @invoices
作为 Array
。当它是 Array
时,javascript 代码根本不会执行。我什至没有收到错误。
所以,结论是: 为什么当我将 ActiveRecord::Relation
传递给 js.erb 以便它可以呈现时,我的 javascript 代码有效通常,当我通过 Array
?
我搜索了很多,但没有找到答案。抱歉英语不好。欢迎指正。
提前致谢。
尝试将其呈现为集合:
var tableLine = $("<%= j render(partial: 'invoice', collection: @invoices, formats: :html) %>");
$("#report_invoice_table").append(tableLine);
我找到问题了。在 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
class,则必须使用其他方法。
<% @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 %>
修改后,我的代码运行正常。