基于常量数组循环分解ruby脚本

时间:2016-11-04 20:34:44

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

在我的Ruby on Rails 4(ruby 2.2)应用程序中,我有一个视图:

<%= sanitize( @template.render(
                                    'text1' => modal['text1'],
                                    'text2' => modal['text2'],
                                    'text3' => modal['text3'],
                                    'text4' => modal['text4'],
                                    'image1' => modal['image1'],
                                    'image2' => modal['image2'],
                                    'image3' => modal['image3']
                                    goes on like this....
)
                                  ) %>

你在上面看到的地方&#39;继续这样下去&#39;,因为我想分析它并使用来自这个常数的dirctly值:

MODAL_ELEMENTS =    [   "text1",
                        "text2",
                        "text3",
                        "text4",
                        "image1",
                        "image2",
                        "image3",
                        "video1",
                        "video2",
                        "video3",
                        "..."
                                ] 

我想找到一种方法来改变sanitize @ template.render中的内容,以便ruby循环遍历每个MODAL_ELEMENTS项(text1,text2,..)并将它们注入像#text;&#39; text1&# 39; =&GT; &#39;文本1&#39; =&GT;模式[&#39; text1&#39;],&#39; text2&#39; =&GT;上面代码中的模态[&#39; text1&#39;]。

今天我有这个,但它失败了:

 <%= sanitize( @template.render(
                  MODAL_ELEMENTS.each { |element| element => modal[ element ] ) ) %>

困难还在于循环必须添加我们在这里以粗体显示的每个昏迷(&#34;,&#34;):

&#39;文本1&#39; =&GT;模态[&#39;文本1&#39;]

&#39;文本2&#39; =&GT;模态[&#39;文本2&#39;]

...

2 个答案:

答案 0 :(得分:1)

假设您有一个名为modal的散列,@template.render也需要散列:

MODAL_ELEMENTS.each_with_object({}){ |element, memo| memo[element] = modal[element] }

使用#each无法输出任何内容。该数组将被处理但不会返回另一个数组。如果您希望它返回某些内容,则应使用#map。这将返回一个基于输入数组的数组。

使用#inject#each_with_object,您可以处理Enumerable并且不会限制输出数组。这个例子在这里输出一个Hash。

答案 1 :(得分:1)

如果它只是你想要的那个字符串并且稍后会对该字符串进行评估,那么这段代码就可以了

MODAL_ELEMENTS.map{ |element| "'#{element}' => modal[ '#{element}' ]"}.join(", ")