2016-08-29 1 views
0

Ich baue ein Highchart für eine HTML-Seite, die von Instanzvariablen von meinem Rails-Controller geliefert wird. Das Problem, das ich erhalte, ist, dass meine Rails-Instanzvariablen, die im Controller gesetzt sind, nicht an meine entsprechende js.erb-Datei übergeben werden. Ich muss noch herausfinden, was die Ursache ist. Könnte jemand helfen, das Problem zu lokalisieren? Unten ist der Code:Warum gibt mein Controller keine Instanzvariablen für die js.erb-Datei?

-Controller

class VulnerabilitiesController < ApplicationController 
    helper ProjectsHelper 
    before_action :set_project_or_fail 
    before_action :set_best_project_security_set 
    before_action :set_releases 
    before_action :set_vulnerabilities 

    def index 
    @release_versions = @releases.map { |r| r.version } 
    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.limit(10) 
    end 

    def set_vulnerabilities 
    @vulnerabilities = @best_project_security_set.vulnerabilities 
    end 
end 

Hier ist die HTML-Datei:

Schwachstellen/index.html.haml

<div id="container" style="min-width: 310px; height: 400px; margin: 0 auto"></div> 

und hier Teil der vulnerabilities.js ist .erb-Datei:

$(function() { 
$('#container').highcharts({ 
    chart: { 
     type: 'column' 
    }, 
    title: { 
     text: 'Vulnerabilities per Version', 
     align: 'left', 
     style: { 
      color: '#336699', 
      fontSize: 16 
     } 
    }, 
    legend: { 
     align: 'left', 
     itemWidth: 127 
    }, 
    xAxis: { 
     categories: <%- @release_versions %> 
    }, 

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

@release_versions gibt immer Null zurück. Ich habe versucht,

categories: <%- @release_versions %> categories: [<%- @release_versions %>] categories: [<%= @release_versions %>] categories: <%= @release_versions %>

Keine dieser Varianten gearbeitet haben. Was könnte das Problem sein?

+0

Passt der Name Ihrer JS-Antwortvorlage zu der Aktion, mit der sie gerendert wird? In Ihrem Beispiel haben Sie 'vulnerabilities.js.erb', aber wenn die' index' Aktion aufgerufen wird, sollte der Name der Antwortvorlage 'index.js.erb' lauten. –

+0

Danke für die Antwort Carlos Ramirez. Der Name der js.erb-Datei sollte keine Rolle spielen. Ich habe die Datei 'vulnerabilities.js.erb' in' application.js' unter 'require tree' erforderlich, daher sollte die Datei in der Anwendung geladen werden. –

+2

Rails Controller übergeben Daten von Instanzvariablen nicht an JS-Dateien, sofern sie nicht vom Controller selbst gerendert werden. Wenn Sie also nur eine '.js.erb'-Datei in Ihre Asset-Pipeline einschließen, werden diese Variablen nicht definiert. –

Antwort

0

Um einen Rails-Controller zum Ausfüllen von Daten zu verwenden, die für eine JS-Vorlage benötigt werden, müssen Sie die Controller-Aktion direkt von Ihrer JS (oder Ansichtsvorlage) aufrufen.

// in a view template or UJS call 
<script>  
    // make an AJAX request to the '/vulnerabilities' URL 
    $.ajax(...); 
</script> 

// VulnerabilitiesController#index action is called; index.js.erb template is rendered 

// in vulnerabilities/index.js.erb 
// here the instance variables from the controller action are defined 
$('#container').highcharts({ 
    // ... 
    xAxis: { 
     categories: <%- @release_versions %> 
    }, 
    // ... 
}; 
+0

Danke für diesen Carlos. Sie hatten Recht mit den Namenskonventionen und es funktionierte nicht, weil ich die Konventionen falsch gemacht hatte. –

+0

Happy Ich könnte helfen! –

Verwandte Themen