我正在为一个小的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]}")

如何在保持缩进的helper块中插入haml代码?

最佳答案

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

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

从你的火腿里叫出来的东西是这样的:
= 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标记的设置,例如/>
如果您想使用pure-haml来标记每张卡片(这个例子很简单,可以不使用帮助程序,但是您肯定想对更复杂的部分执行这个操作),那么可以使用partial。将haml代码添加到名为的文件(例如view.haml)中,然后可以从包含的模板中呈现该代码,并将其作为本地变量传递:
view.haml
- hand.each do |card|
  .span2
    %img(src="/images/#{card[:suite]}_#{card[:value]}")

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

关于ruby - 将HAML插入Sinatra帮助器,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19941863/

10-13 05:08