1

Donc, j'essaye de rendre un tableau d'objets dans mon fichier js.erb. Ma méthode de contrôleur qui fait ressembler le tableau ci-dessous:Rails 4.2 rendre un tableau dans js.erb provoque un plantage

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 

Je sais que c'est un peu moche ce code. J'ai l'intention de le refactoriser. Donc, si la vue passe le params[:approved], je rejette certains objets de la collection. Si la vue n'a pas passé ce paramètre, la méthode reject n'est pas appelée et @invoices est ActiveRecord::Relation. Comme vous pouvez le voir à la fin de cette méthode, je rends un fichier js.erb. Dans ce fichier, j'ai ce code:

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

Le code javascript exécute normalement lorsque @invoices est un ActiveRecord::Relation. Les problèmes surviennent si params[:approved] n'est pas vide. La méthode reject filtre les objets que je ne veux pas, mais renvoie @invoices en tant que Array. Quand il s'agit d'un Array, le code javascript ne s'exécute tout simplement pas. Je n'ai même pas d'erreur.

Donc, conclusion: pourquoi quand je passe un ActiveRecord::Relation au js.erb afin qu'il puisse être rendu, mon code javascript fonctionne normalement et n'a pas quand je passe un Array?

J'ai beaucoup cherché et je n'ai pas trouvé la réponse. Désolé pour le mauvais anglais. N'hésitez pas à me corriger.

Merci d'avance.

Répondre

1

je trouve le problème. Dans le fichier js.erb, j'ai obtenu un code qui calcule la somme de toutes les factures après avoir essayé de rendre les factures.

<% @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 %> 

Comme vous pouvez le voir, j'utilise la méthode .sum. Tout le problème a été causé parce que .sum est une méthode uniquement disponible pour ActiveRecord::Relation. Pour la classe Array, il doit utiliser une autre méthode.

<% @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 %> 

Après l'avoir modifié, mon code fonctionne correctement.

0

Essayez de le rendre comme une collection:

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

Merci pour la réponse, mais n'a pas fonctionné. 'ActiveRecord :: Relation' et' Array' ne fonctionnent pas lorsque j'essaye de rendre un rendu en tant que collection. Et je ne reçois toujours aucun message d'erreur. –