2016-08-31 40 views
0

我有一個js.erb文件與gon變量一起呈現的高圖。我擁有的設置是用戶將加載一個頁面,一旦頁面準備就緒,一個Ajax調用將被髮送到一個單獨的控制器。控制器將處理所需的數據,並將其分配給gon,並將用數據呈現適當的js.erb文件。但是,我一直在觀察gon始終未定義,並且變量未發送至gon。我想知道這是否與ajax有關,但這裏是我的代碼和邏輯流程。使用ajax在js.erb文件中未定義Gon變量

這裏就是呼叫發起

_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"} 

,電話將轉入然後控制器

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文件渲染:

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的用法,但再次沒有運氣。有任何想法嗎?對此事的幫助將不勝感激。

+0

在控制檯不見了可用?當你檢查並輸入'gon'時,該對象是否存在?如果它存在,那麼它添加到它的屬性是不是? – steel

回答

0

我不確定什麼gon在這裏,但如果你聲明gon作爲一個實例變量(@gon),那應該做的伎倆。

控制器

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

查看:show.html.erb

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

我懷疑你js.erb文件未更新全局變量gon

嘗試設置全局變量坤在模板:

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