Ruby on Rails - 每个 do 切片的不同元素

Ruby on Rails - Different elements for each do slices

在我的应用程序中,我先 each_slice 然后 each_with_index 因为我在我的应用程序中做了一些事情。

我现在的代码是这样的:

- @images.each_slice(@album.images_per_page <= 2 ? 1 : 2) do |group|
  - group.each_with_index do |img, i|
    .col-md-2
      /* Ads Left */
    .col-md-7
      = image_tage img.image_url(:thumb)
    .col-md-3
      /* Ads Right */

通常我每页显示4张图片。前 3 个将在 .col-md-2 & .col-md-3 内有广告。我想要实现的是为每个元素添加不同的 ads-codes/type 。

例如,第一张图片有 300x250 标签,第二张图片有 300x600,第三张图片有 content-type广告 (Taboola) 并且在这 3.

之后不显示任何广告

我试过了:(例 1)

- if i == 0
  %h1 300x250
- elsif i == 1
  %h1 300x600
- elsif i == 2
  %h1 Taboola

和(示例 2)

- if i+1 == group.length
  %h1 i+1 = group.length

但我没有得到我要找的东西。 Ex.1 取每 1 个元素并添加 300x250 & 每第二个元素添加 300x600,所以我没有得到 Taboola 并得到 300x250300x600 的两倍,而 Ex.2 取每个第二个元素并仅添加 300x250.

Ex.1 结果变成这样:

Image 1 => 300x250
Image 2 => 300x600
Image 3 => 300x250
Image 4 => 300x600

Ex.2 结果变成这样:

Image 1 => /* Nothing */
Image 2 => 300x250
Image 3 => /* Nothing */
Image 4 => 300x250

我如何才能选择要在每个元素上显示的广告?

我要找的结果:

Image 1 => 300x250
Image 2 => 300x600
Image 3 => Taboola
Image 4 => /* Nothing */

希望我能解释一下我在找什么。

目标应该是在视图中保留尽可能少的逻辑。复杂的逻辑应该在model/controller/helpers.

中完成

这是 zip 的可能性:

@images = %w(imageA imageB imageC imageD)

params = [
  ['300x250','r1'],
  ['300x600','r2'],
  ['Taboola','r3']
]

@images.zip(params).each_with_index do |(image, param), i|
  left, right = param
  puts "Image : #{image}"
  puts "ParamL: #{left}"
  puts "ParamR: #{right}"
  puts "Index : #{i}"
  puts "Even? : #{i.even?}"
  puts
end

它输出:

Image : imageA
ParamL: 300x250
ParamR: r1
Index : 0
Even? : true

Image : imageB
ParamL: 300x600
ParamR: r2
Index : 1
Even? : false

Image : imageC
ParamL: Taboola
ParamR: r3
Index : 2
Even? : true

Image : imageD
ParamL: 
ParamR: 
Index : 3
Even? : false

对于你想做的事情,这些信息似乎已经足够了。

此外,您调用 each_slice 时将 1 或 2 作为参数。 each_slice(1) 基本上没用,each_slice(2) 只会将你的数组分成两部分。检查 id 是奇数还是偶数应该给你同样多的信息,而不需要另一个嵌套块。

each_slice(2) 也是您的索引保持等于 01 的原因。它不能等于 2,所以你的 Taboola 案例从未发生过。