【问题标题】:How to get rails controller variable in js file如何在js文件中获取rails控制器变量
【发布时间】:2014-08-17 03:42:18
【问题描述】:

我在 Rails 控制器中有一个变量,例如

def index
@approveflag = true
end

我需要在我的 javascript 代码中访问这个变量,我使用了下面给出的代码 在 index.html.erb 中

<script>
alert("<%=@approveflag%>")
<script>

结果为“true”时效果很好。但是当我将此代码移动到其相应的 .js 文件时,它会给出一个带有结果字符串“”的警报。 是什么原因。我该如何解决这个问题?

提前致谢。

【问题讨论】:

    标签: javascript ruby-on-rails-4 instance-variables


    【解决方案1】:

    您不能为此使用 js 文件,它们是资产管道的一部分,它们被编译/压缩,最好只由您的客户端(浏览器)下载一次。所以他们不应该改变。因此,在预编译 js 文件时,未设置实例变量,无论如何都没有任何意义。

    但有几个选择。

    您可以在视图中声明一个 javascript 变量,您的 javascript 可以使用该变量(用于全局数据)

    代码(我用的是haml):

    :javascript
      var approveFlag = #{@approveflag} ;
    

    如果数据属于特定元素,您可以在元素上声明数据标签。但例如,您也可以在 body 元素上添加 data-tag

    例如

    %body{:'data-approveflag' => @approveflag}
    

    或者类似的东西

    = link_to 'Collapse', '#', 'data-collapse-div' => 'class-to-collapse'
    

    您也可以使用 ajax/json 下载数据。这是干净的,但会增加额外的延迟,所以只有在不需要立即需要数据时才这样做。

    【讨论】:

      【解决方案2】:

      我个人不喜欢将 js 与 erb 混合,所以我会这样做:

      在 index.html.erb 中

      <%= content_tag :div, '', id: 'mycontainer', data: { source: @approveflag } %>
      

      在js中

      $('#mycontainer').data('source')
      alert($('#mycontainer').data('source'))
      

      如果你有来自该实例变量的值,你可以根据需要在 link_to 中添加一个数据属性。

      【讨论】:

      • 据我尝试应该是这样的:
      • 没有 jQuery:document.getElementById('mycontainer').dataset.source
      【解决方案3】:

      我建议你使用 'gon' gem

      我通常更倾向于使用不意味着安装的直接选项,但相信我使用“gon”非常直接和干净

      在您的 Gemfile 中添加此行

      # To use controller variables as javascript variables
      gem 'gon'
      

      执行捆绑安装以获取/安装 gem

      在您的 app/views/layouts/application.html.erb 中添加以下行

      <%= include_gon %>
      

      然后在你的控制器中将你的变量传递给 gon,就这么简单

      gon.your_variable = @controller_variable
      

      并在您的 javascripts 中检索您的变量(在这种情况下显示警报)

      alert (gon.your_variable) ;
      

      就是这样!

      有关更多示例和详细信息,请参阅 Wiki 页面 - https://github.com/gazay/gon/wiki

      【讨论】:

      • 谢谢! 'gon' 很棒!
      【解决方案4】:

      在我的项目中,有时我需要与用户语言相关的翻译。所以我所做的是,我创建了一个简单的 js 文件来存储本地化文本:

      var TRANSLATION_ARRAY = []
      
      function store_translation(key, value) {
        TRANSLATION_ARRAY[key] = value
      }
      
      function get_translation(key) {
        return TRANSLATION_ARRAY[key]
      }
      

      在 den index.html.erb 或其他组件中,我这样做是为了存储本地化文本:

      store_translation('text_id', "<%= translate_with_user_language('text_id') %>")
      

      在我位于 app/assets/javascripts 的纯 js 文件中,我通过以下方式获取本地化文本:

      get_translation('text_id')
      

      效果很好。您还可以将此方法用于其他目的,而不仅仅是翻译。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-03-25
        • 2020-10-30
        • 2015-11-02
        • 1970-01-01
        • 1970-01-01
        • 2020-05-08
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多