首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将HAML插入到Sinatra助手中

将HAML插入到Sinatra助手中
EN

Stack Overflow用户
提问于 2013-11-12 23:09:01
回答 2查看 689关注 0票数 2

我正在为一个小的Sinatra应用程序编写一个助手,它可以打印一些存储在数组中的游戏卡。

每一张卡都有这样的结构:

代码语言:javascript
复制
{ card: 'Ace', suit: :spades, value:  11 }

卡片图像的文件名是"spades_11.jpg“。

我正在写一个助手来展示我眼中的卡片:

代码语言:javascript
复制
def view(hand)
  hand.each do |card|
    #print the card
  end   
end

我需要这样的输出:

代码语言:javascript
复制
.span2
  %img(src="/images/#{card[:suite]}_#{card[:value]}")

如何在保持缩进的辅助块中插入我的Haml代码?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-11-15 13:30:38

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

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

从你的Haml打来的电话是这样:

代码语言:javascript
复制
= view(@the_hand)

您可以使用辅助对象,它允许您编写如下内容:

代码语言:javascript
复制
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直接写入输出,而不是返回字符串,因此您必须将它与-而不是=一起使用。

代码语言:javascript
复制
- view(@the_hand)

或者使用capture_haml

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

如果您想为每一张卡使用纯Haml标记(这个示例足够简单,可以使用帮助器,但您肯定希望对更复杂的部分使用此方法),则可以使用一个分部。将Haml代码添加到一个名为view.haml的文件中,然后可以从包含的模板呈现它,并将其作为局部变量传入:

view.haml**:**

代码语言:javascript
复制
- hand.each do |card|
  .span2
    %img(src="/images/#{card[:suite]}_#{card[:value]}")

父模板:

代码语言:javascript
复制
= haml :view, :locals => {:hand => @the_hand}
票数 2
EN

Stack Overflow用户

发布于 2013-11-13 00:36:13

您应该能够使用这里,医生

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

但是请注意,这里的docs从are on行开始使用空格,因此不幸的是,这会使缩进变得有些丑陋。

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19941863

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档