我在rails控制器中有一个变量,比如
def index
@approveflag = true
end
我需要访问这个变量在我的javascript代码,我使用下面给出的代码在index.html.erb
<script>
alert("<%=@approveflag%>")
<script>
如果结果为"true"则可以正常工作。但是,当我将这段代码移动到相应的.js文件时,它给出了一个结果字符串"<%=@approveflag%>"的警报。原因是什么?我怎么解决这个问题?
我个人不喜欢把js和动词混在一起,所以我会这样做:
在index.html.erb<%= content_tag :div, '', id: 'mycontainer', data: { source: @approveflag } %>
在js $('#mycontainer').data('source')
alert($('#mycontainer').data('source'))
你有来自实例变量的值,你可以在link_to中添加一个data属性。
您不能使用js
文件,它们是资产管道的一部分,它们被编译/压缩,并且最好只由您的客户端(浏览器)下载一次。所以他们不应该改变。因此,在预编译js文件时,没有设置实例变量,因此没有任何意义。
但是有一些选择
你可以在你的视图中声明一个javascript变量,你的javascript可以使用它(全局数据)
代码(我使用haml):
:javascript
var approveFlag = #{@approveflag} ;
如果数据属于特定的元素,可以在元素上声明数据标记。但是,你也可以在body
元素
data
-标签例如%body{:'data-approveflag' => @approveflag}
或者是
= link_to 'Collapse', '#', 'data-collapse-div' => 'class-to-collapse'
或者你可以使用ajax/json下载数据。这是干净的,但增加了额外的延迟,所以只有在不立即需要数据时才这样做。
我建议你使用'gon' gem
我通常更倾向于直接的选项,不意味着安装,但相信我,使用'gon'是非常直接和干净的
在您的Gemfile中添加以下行
# To use controller variables as javascript variables
gem 'gon'
执行bundle install来获取/安装gem
在你的app/views/layouts/application.html。添加以下行
<%= include_gon %>
然后在你的控制器中传递你的变量到像这样简单的
gon.your_variable = @controller_variable
在你的javascript中检索你的变量(在这个例子中显示一个警告)
alert (gon.your_variable) ;
And That's it !
有关更多示例和详细信息,请参阅Wiki页面- https://github.com/gazay/gon/wiki
在我的项目中,我有时需要与用户语言相关的翻译。我创建了一个简单的js文件来存储本地化后的文本:
var TRANSLATION_ARRAY = []
function store_translation(key, value) {
TRANSLATION_ARRAY[key] = value
}
function get_translation(key) {
return TRANSLATION_ARRAY[key]
}
在index.html.erb或其他组件中,我这样做是为了存储本地化的文本:
store_translation('text_id', "<%= translate_with_user_language('text_id') %>")
在我的纯js文件位于app/assets/javascripts我得到本地化文本:
get_translation('text_id')
效果很好。您还可以将此方法用于其他目的,而不仅仅是翻译。