【问题标题】:Why does my Controller not pass instance variables for js.erb file?为什么我的控制器不为 js.erb 文件传递​​实例变量?
【发布时间】:2016-08-29 15:25:54
【问题描述】:

我正在为我的 rails 控制器中的实例变量提供的 html 页面构建一个高图。我收到的问题是我在控制器中设置的 rails 实例变量没有被传递给我相应的 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>

这是漏洞.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: &lt;%- @release_versions %&gt; categories: [&lt;%- @release_versions %&gt;] categories: [&lt;%= @release_versions %&gt;] categories: &lt;%= @release_versions %&gt;

这些变化都没有奏效。可能是什么问题?

【问题讨论】:

  • 您的 JS 响应模板的名称是否与呈现它的操作匹配?在您的示例中,您有 vulnerabilities.js.erb 但如果正在调用 index 操作,则响应模板的名称应为 index.js.erb 否?
  • 感谢卡洛斯·拉米雷斯的回复。 js.erb 文件名应该无关紧要。我在require tree 下的application.js 中有所需的vulnerabilities.js.erb 文件,因此该文件应该加载到应用程序中。
  • Rails 控制器不会将实例变量数据传递给 JS 文件,除非它们是由控制器本身专门呈现的。因此,如果您只是在资产管道中包含 .js.erb 文件,则不会定义这些变量。

标签: javascript ruby-on-rails ruby highcharts


【解决方案1】:

要利用 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 %>
    },
    // ...
};

【讨论】:

  • 感谢卡洛斯。您对名称归档约定是正确的,但它不起作用,因为我的约定全错了。
  • 很高兴我能帮上忙!
猜你喜欢
  • 2011-08-25
  • 1970-01-01
  • 2013-10-02
  • 2010-11-27
  • 1970-01-01
  • 2010-12-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多