【问题标题】:Rails 3 passing a rails array to javascript function which uses a javascript arrayRails 3将rails数组传递给使用javascript数组的javascript函数
【发布时间】:2011-11-03 23:41:57
【问题描述】:

我正在尝试将 rails 数组传递给 javascript 函数。然后该函数将使用 javascript 中的数组值,因此我需要将其保留为数组。

这是我传递数组的方式:

"graphit([<%=@mpg_values.join(",") %>])"

这会在 HTML 中产生这个

"graphit([#&lt;Mile:0x6ff0cf0&gt;,#&lt;Mile:0x6ff0c18&gt;,#&lt;Mile:0x6ff0b58&gt;])"

哪些不是值,它们应该是十进制数。我认为这是因为它是对数组的引用,所以我为什么会得到混乱的值。如果我执行 to_s 之类的操作,我会看到这些值,但其中还有其他内容,例如表格和文件名。

有人知道如何将这个 rails 数组作为数组转换为 javascript 函数吗?

提前感谢您的帮助。

【问题讨论】:

  • 也许你可以简单地使用@mpg_values.to_json
  • @Ankit Soni 当我使用 to_json 我得到这个 [{"mile":{"mpg":"17.156136063144"}},{"mile":{"mpg":"19.06539208592"}} ,{"mile":{"mpg":"18.471164309032"}}] 所以我得到了额外的里程和 mpg,就像在 to_s 中一样。我想我可以用 javascript 解析它,但我认为会有一种更简单的方法来做到这一点。
  • 直接拨打@mpg_values.inspect怎么样?我认为它返回的格式和JS数组一样。
  • @Ankit-Soni 这似乎和 to_s 给我做的事情一样.. [#>,

标签: javascript arrays ruby-on-rails-3


【解决方案1】:

因为这似乎仍然是一个问题,没有人解决它。来了

var js_array = [<%= raw @object.to_json %>];

【讨论】:

  • 非常感谢这个答案,我一直在寻找它!
  • 在我的情况下不需要添加 []。 Rails 会添加它。所以 var js_array = ;对我来说很好。它可能会帮助某人
  • 这是一个很好的解决方案
【解决方案2】:

使用 Ruby 的 collect 方法。

您的解决方案 Xaxum 的更简洁版本应该是这样的:

def chart_values
  @mpg_values.collect do |mpg_value|
    [ mpg_value.date.to_s, mpg_value.mpg.round(2).to_f ]
  end
end

collect 方法会自动生成一个包含任何块结果的数组,所以你最终会得到这样的结果:

[ 
  [2011-05-20, 18.56], 
  [2011-06-01, 18.47]
]

我还将mpg 的值更改为使用to_f,它提供的是数字而不是字符串。

【讨论】:

    【解决方案3】:

    在这篇文章中多次建议使用 JSON 总是给我这样的东西。

    [{"mile":{"date":"2011-05-20","mpg":"18.565887006952"}},{"mile":{"date":"2011-06-01", "mpg":"18.471164309032"}}]

    我真正想要的只是这个... [[2011-05-20, 18.56][2011-06-01, 18.47]]

    所以我用这样的助手处理了它。

      def chart_values()
        @chart_values = '['
        @mpg_values.each do |m|
          @chart_values = @chart_values+'['+m.date.to_s+', '+m.mpg.round(2).to_s+'],'
        end
        @chart_values = @chart_values+']'
      end
    

    然后将 chart_values() 传递给 javascript。

    可能不是最好的解决方案,但它以我需要的格式为我提供了所需的值。

    【讨论】:

    • 我还需要将特定数组作为 JSON 返回。我重构了您的方法并发布了答案以帮助他人。
    【解决方案4】:

    如果您使用的是 HAML,您可以这样做:

    var js_array = #{object};

    【讨论】:

      【解决方案5】:

      bokor 的答案有效,但如果您希望将数组保存到 const 而不是 var / let,则会导致一些 linter 和 IDE 错误。

      以下变体似乎有效,并且与我正在使用的 linter 和 IDE 兼容。

      const js_array = JSON.parse('&lt;%= raw @object %&gt;');

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-02-08
        • 2012-02-11
        • 2017-05-29
        • 1970-01-01
        • 2014-06-11
        • 1970-01-01
        • 2017-11-07
        相关资源
        最近更新 更多