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



我在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')

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

相关内容

  • 没有找到相关文章

最新更新