Rails 4:将变量传递给javascript

我已经尝试了很多方法并且遵循了Ryan Bates的指南,但无论我做什么,我仍然未定义。

application.html.erb

   </body 

application.js.erb

 var datadump = ($('#trackers').data('trackers')) console.log(datadump) //returns undefined in console 

查看页面源我可以看到变量

 

我现在正在传递User.count只是为了保持简单,但我需要传递@trackers_count,它在应用程序控制器的before_action中实例化。 一旦我在这里找出问题,我应该能够解决这个问题。 有什么建议?

更新 – 我已将所有变量简化为仅跟踪器,而不是trackers_count,以防止语法和更新代码中的任何错误反映出来。

答案更新 – 我选择了正确的答案,因为如果你想传递任何变量ASIDE FROM CURRENT_USER那些方法是完美的。 但是,您无法使用JS中的current_user访问任何内容,因为它在窗口之前加载,因此无法知道current_user是谁。 这是一个真正的痛苦,但我只是做了很长的路,并通过传入json和ajax请求访问我需要的信息。

我曾经做过:

 var my_var = <%= User.count %> console.log(my_var) 

如果它是一个整数,这可以正常工作。 但是,如果要传递对象,请使用:

 var my_var = JSON.parse(('<%= (@Users.count) == 0 ? "[]" : Users.first(10).to_json %>') console.log(JSON.stringify(my_var)) 

你忘了准备文件了。 尝试:

 $(function(){ var datadump = ($('#trackers').data('trackers')); console.log(datadump) }); 

或者从Rails到JS提供数据使用Gon gem https://github.com/gazay/gon

从谷歌这里跌跌撞撞。 在我的例子中,我试图将一个对象数组传递给js.erb,这触发了前端组件侦听的事件。 对于谷歌的任何人,我通过执行以下操作解决了这个问题:

在我的controller.rb中:

 @payload = [] array.each do |a| temp = { foo: a.id, bar: a.relation.relation } @payload << temp end 

在我的js.erb中:

 $(document).trigger('event', { data: <%= @payload.to_json.html_safe %> }) 

在我的component.js中:

 $(document).on('event', (e, data) => { console.log(data) //should be array of objects in proper format }) 

希望这有助于某人!