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?
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. –
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. –
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. –