如何在循环中关闭容器?

我有一个产品列表,我想在产品Feed中展示广告。

我想要的东西:

Bla..
Bla..
Bla..
Adsense Stuff
Bla..
Bla..
Bla..
Bla..
Bla..

在再培训局,我会:

 
Adsense Stuff

你怎么把它翻译成Haml或Slim?

我不想在两个循环中打破循环有两个原因:我不知道产品按页面计算,我有一些更复杂的代码,它使用与Rails cycle()帮助器相同的HTML技巧。 所以,找到一个让它成为可能的技巧对我有很大的帮助。

Haml允许您在需要时将原始HTML写为输出。 虽然很奇怪,但你可以使用它来实现你的目标,就像你使用Erb一样:

 TEMPLATE = ' .container - products.each_with_index do |product,index| - if index == 2  
AdSense Stuff
.product< = product ' require 'haml' products = %w[ cat box kitten shoes hounds ] puts Haml::Engine.new(TEMPLATE).render binding #=>
#=>
cat
#=>
box
#=>
#=>
AdSense Stuff
#=>
#=>
kitten
#=>
shoes
#=>
hounds
#=>

缩进看起来很奇怪,但你可以看到你有两个容器,其中包含AdSense内容。

在HAML

 -products.each_with_index do |product,index| .product= product -if index == 2 .ad= Adsense Stuff 

我不打扰容器,只需设置css来处理产品和广告类。 (这也表明你有多个同名的id,这些应该改为类)。

 - products.each_with_index do |product,index| .product = product - if index == 2 .ad= Adsense Stuff 

这应该做到吗?

一个可能的Haml解决方案,使用surround助手 :

 .container -products.each_with_index do |product,index| .product=product -if index == 2 =surround "", "
" do .add Adsense stuff

这有点像黑客,因为我们“假装”关闭并打开容器div; 哈姆知道我们还在其中。 出于这个原因,它还引入了一些重复,因为你必须在两个地方指定“容器”类(以及div可能具有的任何其他属性)。

这个解决方案与@ Phrogz的解决方案类似,但这有点“Haml-ly”,允许您使用Haml语法来定义add div。

Interesting Posts