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

Ann*_*nna 5 javascript instance-variables ruby-on-rails-4

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

def index
@approveflag = true
end
Run Code Online (Sandbox Code Playgroud)

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

<script>
alert("<%=@approveflag%>")
<script>
Run Code Online (Sandbox Code Playgroud)

结果为"true"时效果很好.但是当我将此代码移动到相应的.js文件时,它会发出一个结果字符串""<%= @ approveflag%>""的警告.是什么原因.我怎么解决这个问题?

提前致谢.

ale*_*smn 8

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

在index.html.erb中

<%= content_tag :div, '', id: 'mycontainer', data: { source: @approveflag } %>
Run Code Online (Sandbox Code Playgroud)

在js

$('#mycontainer').data('source')
alert($('#mycontainer').data('source'))
Run Code Online (Sandbox Code Playgroud)

并且您拥有该实例变量的值,您可以根据需要在link_to中添加数据属性.


nat*_*vda 5

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

但是有一些选择.

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

代码(我使用haml):

:javascript
  var approveFlag = #{@approveflag} ;
Run Code Online (Sandbox Code Playgroud)

如果数据属于特定元素,则可以在元素上声明数据标记.但是,例如,你也可以databody元素上添加-tag

例如

%body{:'data-approveflag' => @approveflag}
Run Code Online (Sandbox Code Playgroud)

或类似的东西

= link_to 'Collapse', '#', 'data-collapse-div' => 'class-to-collapse'
Run Code Online (Sandbox Code Playgroud)

或者,您可以使用ajax/json下载数据.这很干净,但增加了额外的延迟,所以只有这样才能立即获得数据.


Mau*_*rez 5

我建议您使用“ gon”宝石

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

在您的Gemfile中添加以下行

# To use controller variables as javascript variables
gem 'gon'
Run Code Online (Sandbox Code Playgroud)

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

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

<%= include_gon %>
Run Code Online (Sandbox Code Playgroud)

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

gon.your_variable = @controller_variable
Run Code Online (Sandbox Code Playgroud)

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

alert (gon.your_variable) ;
Run Code Online (Sandbox Code Playgroud)

就是这样!

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