如何使用haml循环遍历yaml序列中的选定项目

时间:2015-12-28 12:49:44

标签: ruby yaml haml

我有一个包含推荐的yaml序列,我想在某些地方完整地循环,但只有部分地在其他地方。简而言之,如何选择和循环haml中的yaml序列中的特定项?

以下示例将被删除

我的yaml数据

# testimonials.yml

-
  name: 'Jill'
  quote: 'An unbelievable experience!'
  photo: 'jill.jpg'
-
  name: 'Jack'
  quote: 'I unreservedly recommend this programme'
  photo: 'jack.jpg'
-
  # ... etc 

一个基本的工作haml循环

-# about.html.haml

- data.testimonials.each do |testimonial|
  %div
    %img{ :src => testimonial.photo }
    %p= testimonial.name
    %p= testimonial.quote

我想要实现的目标

然而,在另一部分中,我只想循环遍历序列中的特定推荐,例如。 [0, 4, 7]。在我的天真中,我认为这类似于在循环之外选择特定的序列项,例如。 %p= data.testimonials[0].name,如此:

- data.testimonials[0, 4, 7].each do |testimonial|
  %div
    %img{ :src => testimonial.photo }
    %p= testimonial.name
    %p= testimonial.quote

然而......这会返回'错误数量的参数'错误,因为看起来此方法只接受序列/数组中的单个范围,例如testimonials[4, 7](或{ {1}},[4..7]等)。

问题

有没有办法将多个范围传递到此循环中,例如。 2..2(这不起作用,但你得到了我的漂移)?或者,这甚至是推荐的实现这一结果的方法吗?也就是说,是否有一种标准且更有效的方法来选择和循环yaml序列中的特定项目(或范围)?

注意

我觉得[0..2 && 4..7]方法in this post(粘贴在下面)包含答案......但我可能错了,我不知道如何使用它...

  

选择
  (避免别名:find_all)
  当您需要过滤(即“选择”)多个值时非常有用   select

为了测试,我试图将上面的内容翻译成[1, 2, 3, 4].select { |e| e % 2 == 0 } # returns [2, 4],它只返回整个序列,以及- data.testimonials.select do |testimonial| testimonial == 1,它会返回语法错误。 ..

3 个答案:

答案 0 :(得分:5)

您也可以使用此Array#values_at

例如

- data.testimonials.values_at(0, 4, 7).each do |testimonial|
  %div
    %img{ :src => "#{testimonial.photo}" }
    %p= testimonial.name
    %p= testimonial.quote

答案 1 :(得分:2)

使用 each_with_index

- data.testimonials.each_with_index do |testimonial, index|
  - if [0, 4, 7].include? index
    %div
      %img{ :src => testimonial.photo }
      %p= testimonial.name
      %p= testimonial.quote

您可以使用 Array#values_at ,它将提取给定索引号的值,并仅为这些值循环,而是循环遍历所有元素。 例如:

> array = ["a", "b", "c", "d", "e", "f", "g", "h"] 
> array.values_at(0, 4, 7)
#=> ["a", "e", "h"]

答案 2 :(得分:1)

使用each_with_index将传递元素及其索引,然后在块中执行if [2,6,9] .include?要检查的索引