2016-08-31 1 views
0

Ich habe ein Highchart, das von einer js.erb Datei in Verbindung mit der gon Variable gerendert wird. Das Setup, das ich habe, ist, dass ein Benutzer eine Seite lädt und sobald die Seite fertig ist, wird ein Ajax-Anruf an einen separaten Controller gemacht. Der Controller wird die benötigten Daten verarbeiten, sie dem gon zuweisen und die entsprechende js.erb Datei mit den Daten rendern. Allerdings beobachte ich, dass gon konsequent undefiniert ist und die Variablen nicht an gon gesendet werden. Ich frage mich, ob das mit Ajax zu tun hat, aber hier ist mein Code und Logikfluss.Gon-Variable ist nicht in Js.ERB-Datei mit AJAX definiert

Hier ist, wo der Anruf stammt

_vulnerabilites_per_version.html.haml 

%script{:src => "https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"} 
= Gon::Base.render_data 


- vanity_url = project.vanity_url 
:javascript 
    $(document).ready(function() { 
    $.ajax({ 
     url: "/p/#{vanity_url}/security.js" 
    }); 
    }) 

#vulnerabilities{:style => "max-width: 405px; height: 300px; margin: 0 auto"} 

Der Anruf geht dann an die Steuerung

class VulnerabilitiesController < ApplicationController 

    before_action :set_project_or_fail 
    before_action :set_best_project_security_set 
    before_action :set_releases 
    before_action :set_vulnerabilities 

    def vulnerabilities_per_version 
    gon.watch.release_versions = @releases.map { |r| r.version } 
    puts gon.release_versions 
    end 

    private 

    def set_project_or_fail 
    project_id = params[:project_id] || params[:id] 
    @project = Project.by_vanity_url_or_id(project_id).take 
    raise ParamRecordNotFound unless @project 
    end 

    def set_best_project_security_set 
    @best_project_security_set = @project.best_project_security_set 
    end 

    def set_releases 
    @releases = @best_project_security_set.releases.order(released_on: :asc).limit(10) 
    end 

    def set_vulnerabilities 
    @vulnerabilities = Array.new(3) { [] } 
    @releases.each do |r| 
     @vulnerabilities[0] << r.vulnerabilities.low.count 
     @vulnerabilities[1] << r.vulnerabilities.medium.count 
     @vulnerabilities[2] << r.vulnerabilities.high.count 
    end 
    end 
end 

Wie Sie sehen können, ist die release_versions Variable gon übergeben wird, und ich kann es sehen in Die Protokolle, dass die Werte, nach denen ich suche, dort sind.

Sobald wir den Controller verlassen, die js.erb Datei wiedergegeben wird:

vulnerabilites_per_version.js.erb 

alert(gon.watch.release_versions) 

$(function() { 
    $('#vulnerabilities').highcharts({ 
     chart: { 
      type: 'column' 
     }, 
     title: { 
      text: 'Vulnerabilities per Version', 
      align: 'left', 
      style: { 
       color: '#336699', 
       fontSize: 16 
      } 
     }, 
     legend: { 
      align: 'left', 
      itemWidth: 127 
     }, 
     xAxis: { 
      categories: gon.release_versions 
     }, 
     yAxis: { 
      min: 0, 
      title: { 
       text: 'Vulnerabilities' 
      }, 

      .........code..... 

Was die Ursache für dieses Problem sein könnte? Warum kann ich nicht auf die Daten in meiner js.erb Datei zugreifen? Laut der gon Dokumentation sollte alles in Ordnung sein, damit die Daten gerendert werden, aber nicht. Als zweiten Versuch ging ich auch weiter auf die Verwendung, aber wieder kein Glück. Irgendwelche Ideen? Hilfe in der Sache würde sehr geschätzt werden.

+0

Ist in der Konsole verfügbar gegangen? Wenn Sie "gon" überprüfen und eingeben, existiert dieses Objekt? Wenn es existiert, ist es die Eigenschaft, die Sie hinzugefügt haben, die das nicht tut? – steel

Antwort

0

Ich bin nicht sicher, was gon ist hier, aber wenn Sie gon als Instanzvariable (@gon) deklarieren, sollte das den Trick tun.

-Controller

def show 
    @dog = Dog.first 
    cat = Cat.first 
end 

Ausblick: show.html.erb

@dog.name => "Sparky" 
cat.name => undefined method 'name' for nil class 
0

Ich vermute, dass Ihre js.erb Datei die globale gon Variable nicht aktualisiert.

Versuchen Sie, die globale gon Variable in der Vorlage setzen:

#vulnerabilites_per_version.js.erb 
gon = #{gon} 
console.log(gon.watch.release_versions) 
Verwandte Themen