Rails 4.2 рендеринг массива в js.erb приводит к сбою
Итак, я пытаюсь визуализировать массив объектов в моем файле 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 %>
Код JavaScript выполняется нормально, когда @invoices
является ActiveRecord::Relation
, Проблемы возникают, если params[:approved]
не пусто reject
метод фильтрует объекты, которые мне не нужны, но возвращает @invoices
как Array
, Когда это Array
код JavaScript просто не выполняется. Я даже не получаю ошибку.
Итак, вывод: почему, когда я прохожу ActiveRecord::Relation
в js.erb, чтобы он мог быть представлен, мой код JavaScript работает нормально, и не работает, когда я передаю Array
?
Я много искал и не смог найти ответ. Извините за плохой английский. Не стесняйтесь поправлять меня.
Заранее спасибо.
2 ответа
Я выясняю проблему. В файле 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);