首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在使用ajax的js.erb文件中未定义Gon变量

在使用ajax的js.erb文件中未定义Gon变量
EN

Stack Overflow用户
提问于 2016-09-01 02:16:28
回答 2查看 438关注 0票数 0

我有一个由带有gon变量的js.erb文件呈现的高度表。我的设置是,用户将加载一个页面,一旦页面准备就绪,就会对一个单独的控制器进行ajax调用。控制器将处理所需的数据,将其分配给gon,并使用该数据呈现适当的js.erb文件。然而,我一直观察到gon始终是未定义的,并且变量没有被发送到gon。我想知道这是否与ajax有关,但以下是我的代码和逻辑流程。

这里是调用的起始点

代码语言:javascript
复制
_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"}

然后,调用转到控制器

代码语言:javascript
复制
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

正如您所看到的,release_versions变量正被传递给gon,我可以在日志中查看我正在查找的值在那里。

一旦离开控制器,就会呈现js.erb文件:

代码语言:javascript
复制
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.....

此问题的原因可能是什么?为什么我无法访问js.erb文件中的数据?根据gon文档,我应该已经为数据的渲染做好了一切准备,但它并没有。作为第二次尝试,我也继续阅读了gon.watch的用法,但还是没有成功。有什么想法吗?在这件事上的帮助将非常感谢。

EN

回答 2

Stack Overflow用户

发布于 2016-09-01 02:40:53

我不确定这里的gon是什么,但是如果您将gon声明为一个实例变量(@gon),那么应该可以做到这一点。

控制器

代码语言:javascript
复制
def show
  @dog = Dog.first
  cat = Cat.first
end

查看:show.html.erb

代码语言:javascript
复制
@dog.name => "Sparky"
cat.name  => undefined method 'name' for nil class
票数 0
EN

Stack Overflow用户

发布于 2016-09-01 03:36:41

我怀疑您的js.erb文件没有更新全局gon变量。

尝试在模板中设置全局gon变量:

代码语言:javascript
复制
#vulnerabilites_per_version.js.erb
gon = #{gon}
console.log(gon.watch.release_versions)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39256425

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档