【问题标题】:Rails 4: Passing variables to javascriptRails 4:将变量传递给javascript
【发布时间】:2015-03-05 05:20:13
【问题描述】:

我尝试了多种方法并遵循Ryan Bates' 指南,但无论我做什么,我仍然无法定义。

application.html.erb

<body>
 <%= content_tag :div, id: 'trackers', data: {trackers: User.count} do %>
 <% end %>
</body

application.js.erb

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

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

<div data-trackers="2" id="trackers">

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

更新 - 我已将所有变量简化为仅跟踪器,而不是 trackers_count,以防止语法出现任何错误,并在此处更新代码以反映这一点。

ANSWER UPDATE - 我选择了正确的答案,因为如果您想传递除 CURRENT_USER 之外的任何变量,这些方法效果很好。但是,你不能在 JS 中使用 current_user 访问任何东西,因为它在窗口之前加载,所以它无法知道 current_user 是谁。这是一个真正的痛苦,但我只是做了很长的路,并通过传入 json 和 ajax 请求访问了我需要的信息。

【问题讨论】:

  • 试试$('#trackers_count').data('trackers-count'),用连字符代替下划线,就像在 HTML 中一样。
  • @Santhosh,没有变化..
  • 你能链接到你正在谈论的特定轨道演员吗?
  • @patrick,我把它链接到了顶部。在他开始谈论 gon gem 并稍稍换档之前,您只需走到大约 4 分钟标记处。
  • 您能在 content_tag 块中添加一些内容,例如“正在加载跟踪器...”吗?只是为了按照 railscast 获得它

标签: javascript ruby-on-rails variables ruby-on-rails-4


【解决方案1】:

我曾经这样做过:

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))

【讨论】:

  • 因为我试图在控制器中拉入跟踪器,它是 @trackers =current_user.trackers.where(viewed: false).count 并且基于当前用户,你会如何拉进去?上述两种方法都适用于 User.count,但我没有看到如何为控制器方法实现它。
  • 我没有收到您的问题,但对于 my_var = 之类的控制器变量,它可以正常工作。如果控制器变量正在改变状态(我的意思是计数或变量的任何其他属性),您需要在某个事件上或每 n 秒后触发 ajax 请求,以询问服务器嘿伙计什么是变量的更新版本。请注意,rails 渲染视图(连同 js)并忘记所有内容。
  • 您不能在此处使用控制器方法代替 User.count。您需要在实例变量中收集它,并且可以在此处使用该变量。让我知道您的具体要求是什么。可能有更好的方法来做到这一点。
  • 我可能只需要发送一个获取请求来提取数据。我只是想填充变量,因为我已经设置了一个 get 请求方法,而这一切需要做的就是第一次更新计数。之后,该方法的其余部分将自行处理。不过,必须有一种方法可以在其中获取此信息。这不应该这么难
【解决方案2】:

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

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

或者为了从 Rails 向 JS 提供数据,请使用 Gon gem https://github.com/gazay/gon

【讨论】:

  • 我已在本地代码中准备好文档。 gon gem 似乎也遇到了与 current_user 无法通过的相同问题。我也试过了。
【解决方案3】:

从谷歌偶然发现这里。在我的例子中,我试图将一个对象数组传递给一个 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
})

希望这对某人有所帮助!

【讨论】:

    【解决方案4】:

    This 可以帮助你。

    对我来说,我想转这个数组

      @dates = ["2018-12-24", "2018-12-25", "2018-12-26", "2018-12-27", "2018-12-28"]
    

    在 Javascript 中写入变量。我尝试了基本的:

    var dates = <%= @dates.join(", ") %>
    alert(my_var)
    

    这提醒了这个确切的文本:

    1995
    

    我不知道为什么。

    由于它不起作用,我通过复制和粘贴尝试了 Guru 的解决方案,但现在更糟糕的是,我的代码中出现了错误。最后我得到了 Guru 的解决方案,像这样工作:

    (打印嵌入的红宝石打开和关闭在 JSON.parse() 之外工作,并且缺少“)”)

      var dates = <%= JSON.parse(@dates.join(", ").to_json)%>
      alert(dates)
    

    但即使它没有崩溃,想猜一下它发出了什么警报吗?

    是的,你猜对了:

    1995
    

    所以我放弃了,我使用了一种解决方法:

    在我看来edit.html.erb

    <div class="dates"><%= @dates.join(", ") %></div>
    <script>
      var dates = $(".dates").text()
      alert(dates)
      $(".datepicker").val(dates)
    </script>
    

    这使我可以输入变量,从而提醒正确的数据并使用正确的信息设置 Datepicker 的输入。我仍然因为无法解决 1995 年的漏洞问题而烦恼。如果有人可以解释一下,我将不胜感激。希望这会有所帮助,祝您有美好的一天!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-01-16
      • 2013-07-05
      • 2014-10-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多