2

我正在为一个小型 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 代码?

4

2 回答 2

2

您应该可以使用此处的文档

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

但请注意,此处的文档从行首开始使用空格,因此不幸的是,这会使您的缩进有些难看。

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

于 2013-11-13T00:36:13.877 回答
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帮助程序,它可以让您编写如下内容:

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}
于 2013-11-15T13:30:38.590 回答