【问题标题】:how to render Ruby array as JavaScript array in ERB template [duplicate]如何在ERB模板中将Ruby数组呈现为JavaScript数组[重复]
【发布时间】:2015-10-28 02:39:45
【问题描述】:

我需要为 erb 模板以非常特定的格式呈现 Ruby 数组。这是因为我正在使用 JQcloud 使用 JQuery 构建词云,并且显然对数组格式很挑剔。

这里是JQcloud要求对JS数组进行格式化的方式:

var word_array = [
          {text: "Lorem", weight: 15},
          {text: "Ipsum", weight: 9},
          {text: "Dolor", weight: 6},
          {text: "Sit", weight: 7},
          {text: "Amet", weight: 5}
          // ...as many words as you want
      ];

所以我在控制器中创建了两个数组,一个用于构建我的云的单词数组,另一个用于每个单词的权重数组。

ruby_word_array = ["Lorem","Ipsum","Dolor","Sit","Amet"]
ruby_weight_array = [15,10,13,8,4]

我需要将我的两个 Ruby 数组转换为使用 erb 正确呈现的方式。到目前为止,我想出了:

var wordArray = <%= raw @word_array.map{|a, i| {text: @word_array[0], weight: 15} } %> # I just hard coded the weight for simplicity

这给了我一些很接近但不够接近的东西,它最终的格式如下:

var wordArray = [{:text=>"Lorem", :weight=>15}, {:text=>"Ipsum", :weight=>15}]

我真的只需要知道如何修改我的上一个示例以使用 Python 样式的哈希语法 {key: "value"},{key_2: "value_2"}

老实说,这是一个棘手的问题,我很难过。我为此使用的库称为 JQcloud,它有一个 Ruby gem,我已将它合并到这个 Rails 应用程序中。 Here is a link.

【问题讨论】:

    标签: ruby-on-rails ruby ruby-on-rails-4 erb


    【解决方案1】:

    你为什么不直接使用to_json

    # in ruby
    @array = [{:text=>"Lorem", :weight=>15}, {:text=>"Ipsum", :weight=>15}]
    

    那么,在视图中:

    var wordArray = <%= @array.to_json.html_safe %>;
    

    将渲染:

    var wordArray = [{"text":"Lorem","weight":15},{"text":"Ipsum","weight":15}];
    

    【讨论】:

    • 这是最简单的方法。如果不使用 Rails,您可能需要将 require 'json' 添加到文件顶部。此外,要从 json 字符串转到 ruby​​,您可以执行 JSON.parse(json_string)
    • 没错。在 Rails 中将自动需要 json 库,但您需要手动需要它。
    • 所以我之前尝试过 to_json 没有成功,但后来我意识到我需要将我的 ruby​​ 数组转换为哈希数组,然后调用 to_json。现在它似乎工作了。
    【解决方案2】:

    您应该在 app/helpers 中创建一个辅助函数来执行您想要的行为。最好将复杂的逻辑排除在视图之外。然后在视图中

    var wordArray = <%= myHelper @word_array %>
    

    在助手中

    def myHelper(word_array):
      string = "["
      word_array.each do |word|
        string << "{text: \"#{word[:text]}\", weight: #{word[:weight]}},"
      string = string.chomp(",") #in case JS hates the last comma
      string << "]"
      return string
    

    实际上,您可以在 myHelper 中放入任何您想要的东西。您可以传递两个数组并将它们放在帮助器中。您可以在字符串中添加换行符。一切皆有可能

    【讨论】:

      【解决方案3】:

      在这种 2 Arrays 的情况下,zip 很有用。

      ruby_word_array.zip(ruby_weight_array).map{|word, weight| "{text: #{word}, weight: #{weight}}"}.join(',')
      

      如果你需要[]

      '[' + ruby_word_array.zip(ruby_weight_array).map{|word, weight| "{text: #{word}, weight: #{weight}}"}.join(',') + ']'
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-04-03
        • 1970-01-01
        • 2011-11-25
        • 1970-01-01
        • 2017-11-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多