如何在js文件中获取rails控制器变量

时间:2014-06-26 10:19:36

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

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

def index
@approveflag = true
end

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

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

结果为“true”时效果很好。但是当我将此代码移动到相应的.js文件时,它会发出一个结果字符串“”&lt;%= @ approveflag%&gt;“”的警告。 是什么原因。我该如何解决这个问题?

提前致谢。

4 个答案:

答案 0 :(得分:7)

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

index.html.erb中的

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

在js

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

如果您拥有该实例变量的值,则可以根据需要在link_to中添加数据属性。

答案 1 :(得分:5)

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

但是有一些选择。

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

代码(我使用haml):

:javascript
  var approveFlag = #{@approveflag} ;

如果数据属于特定元素,则可以在元素上声明数据标记。但是,例如,您还可以在data元素

上添加body标记

例如

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

或类似

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

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

答案 2 :(得分:4)

我建议你使用&#39; gon&#39;宝石

我通常更倾向于直接选择并不意味着安装,但请相信我使用&#39; gon&#39;非常直接和干净

在您的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

答案 3 :(得分:1)

在我的项目中,我有时需要与用户语言相关的翻译。所以我做的是,我创建了一个简单的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')

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