2016-08-29 19 views
0

私は、レールコントローラからインスタンス変数によって提供されるhtmlページのハイチャートを作成しています。私が受け取っている問題は、コントローラに設定されたレールインスタンス変数が、対応するjs.erbファイルに渡されていないことです。私は原因が何であるかをまだ判断していません。誰かが問題の原因を突き止めるのに役立つでしょうか?コントローラがjs.erbファイルのインスタンス変数を渡さないのはなぜですか?

コントローラここ

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 

htmlファイルされる:以下のコードがある

脆弱性/ index.html.haml

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

、ここvulnerabilities.jsの一部であり、 .erbファイル:

$(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は毎回nilを返します。私は、これらの変化はいずれも働いていない

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

を試してみました。何が問題なの?

+0

JSレスポンステンプレートの名前は、それをレンダリングするアクションと一致しますか?あなたの例では 'vulnerabilities.js.erb'がありますが、' index'アクションが呼び出されている場合、レスポンステンプレートの名前は 'index.js.erb'でなければなりません。 –

+0

レスポンスありがとうCarlos Ramirez。 js.erbファイル名は重要ではありません。 'requires tree'の' application.js'に 'vulnerabilities.js.erb'ファイルが必要です。したがって、ファイルはアプリケーションにロードされるべきです。 –

+2

Railsコントローラは、コントローラ自身によってレンダリングされない限り、インスタンス変数データをJSファイルに渡しません。したがって、アセットパイプラインに '.js.erb'ファイルだけを含めると、これらの変数は定義されません。 –

答えて

0

Railsコントローラを使用してJSテンプレートに必要なデータを設定するには、コントローラアクションをJS(またはビューテンプレート)から直接呼び出す必要があります。

// 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

これはカルロスに感謝します。あなたは、名前の提出規則については正しかったし、私は規則がすべて間違っていたので、それは機能していなかった。 –

+0

うれしい私は助けることができた! –

関連する問題