我正在为一个小型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代码以保留缩进?
答案 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}