我在rails控制器中有一个变量,如
def index
@approveflag = true
end
我需要在我的javascript代码中访问此变量,我使用下面给出的代码 在index.html.erb
<script>
alert("<%=@approveflag%>")
<script>
结果为“true”时效果很好。但是当我将此代码移动到相应的.js文件时,它会发出一个结果字符串“”&lt;%= @ approveflag%&gt;“”的警告。 是什么原因。我该如何解决这个问题?
提前致谢。
答案 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')
效果很好。您也可以将此方法用于其他目的,而不仅仅是翻译。