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);
Другие вопросы по тегам