1

그래서 js.erb 파일에 객체 배열을 렌더링하려고합니다. 배열을 만드는 컨트롤러 메서드는 아래처럼 보입니다.Rails 4.2에서 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]을 전달하면 컬렉션의 일부 객체를 거부합니다. 뷰가이 param를 건네주지 않은 경우는, reject 메서드는 불려 가지 않고, @invoicesActiveRecord::Relation입니다. 여러분이이 방법의 끝에서 볼 수 있듯이, 나는 js.erb 파일을 렌더링합니다. 이 파일의 내부에서,이 코드를 가지고 : @invoicesActiveRecord::Relation

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

자바 스크립트 코드는 정상적으로 실행됩니다. params[:approved]이 비어 있으면 문제가 발생합니다. reject 메서드는 원하지 않는 개체를 필터링하지만 @invoicesArray으로 반환합니다. Array 일 때 자바 스크립트 코드는 단순히 실행되지 않습니다. 나는 심지어 오류를 얻지 않는다.

그래서, 결론 : 그것은 렌더링 할 수 있도록 나는 js.erb에 ActiveRecord::Relation를 통과 할 때, 내 자바 스크립트 코드가 정상적으로 작동하고 Array를 I를 통과 할 때하지 않은 이유?

나는 수색을 많이하고 대답을 찾지 못했습니다. 나쁜 영어에 대해 유감스럽게 생각합니다. 저를 시정 해주십시오.

미리 감사드립니다.

답변

1

내가 문제를 찾을 수 있습니다. 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 방법을 사용합니다. .sumActiveRecord::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 %> 

변경 한 후에 코드가 정상적으로 작동합니다.

0

봅니다 모음으로 렌더링하기 :

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

답변 주셔서 감사합니다. 그러나 작동하지 않았습니다. 'ActiveRecord :: Relation'과'Array'는 콜렉션으로 렌더링하려고 할 때 작동하지 않습니다. 그리고 여전히 오류 메시지가 표시되지 않습니다. –