将HAML插入Sinatra助手

时间:2013-11-12 23:09:01

标签: ruby sinatra haml

我正在为一个小型Sinatra应用程序编写一个帮助程序,该应用程序将一些存储为哈希的游戏卡打印在一个数组中。

每张卡都有这种结构:

{ card: 'Ace', suit: :spades, value:  11 }

并且卡片图像的文件名是“spades_11.jpg”。

我正在写一个帮手,在我看来显示卡片:

def view(hand)
  hand.each do |card|
    #print the card
  end   
end

我需要这样的输出:

.span2
  %img(src="/images/#{card[:suite]}_#{card[:value]}")

如何在助手块中插入我的Haml代码以保留缩进?

2 个答案:

答案 0 :(得分:2)

您应该可以使用here doc

def view(hand)
  hand.each do |card|
    <<-HAML
.span2
  %img(src="/images/#{card[:suite]}_#{card[:value]}")
    HAML
  end   
end

但是请注意,这里的docs从行的开头开始占用空格,所以很遗憾,这会让你的缩进有些难看。

对于任何更复杂的事情,将haml编写在单独的.haml文件中可能是有意义的。

答案 1 :(得分:2)

最简单的解决方案是直接从您的助手返回HTML作为字符串:

def view(hand)
  hand.map do |card|
    "<div class='span2'><img src='/images/#{card[:suite]}_#{card[:value]}'></div>"
  end.join 
end

从你的Haml调用它,例如:

= view(@the_hand)

你可以使用haml_tag helper来写一些类似的东西:

def view(hand)
  hand.each do |card|
    haml_tag '.span2' do
      haml_tag :img, 'src' => "/images/#{card[:suite]}_#{card[:value]}"
    end
  end   
end

请注意,haml_tag直接写入输出而不是返回字符串,因此您必须将其与-而不是=一起使用:

- view(@the_hand)

或使用capture_haml

此方法意味着您的助手依赖于Haml。第一种方法可用于您使用的任何模板语言,但不会尊重format之类的设置,以确定是否使用img结束/>标记。

如果你想使用纯Haml作为每张卡的标记(这个例子很简单,可以逃脱帮助,但你肯定想要为更复杂的部分做这个),你可以使用部分。将Haml代码添加到名为eg的文件中view.haml,然后您可以从包含模板中呈现它,将手作为局部变量传递:

<强> view.haml

- hand.each do |card|
  .span2
    %img(src="/images/#{card[:suite]}_#{card[:value]}")

父模板:

= haml :view, :locals => {:hand => @the_hand}