【问题标题】:Insert HAML into a Sinatra helper将 HAML 插入 Sinatra 助手
【发布时间】:2013-11-15 21:30:38
【问题描述】:

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

【问题讨论】:

    标签: ruby sinatra haml


    【解决方案1】:

    最简单的解决方案是直接从帮助程序中将 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 等设置是否以/&gt; 结束img 标记。

    如果您想对每张卡片使用纯 Haml 标记(这个例子很简单,可以不用助手,但您当然希望对更复杂的部分这样做),您可以使用部分。将您的 Haml 代码添加到名为例如的文件中。 view.haml,然后你可以从包含模板中渲染它,作为局部变量传入手中:

    view.haml:

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

    父模板:

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

    【讨论】:

      【解决方案2】:

      您应该可以使用here doc

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

      但请注意,此处的文档从行首开始使用空格,因此很遗憾,这会使您的缩进有点难看。

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

      【讨论】:

      • 缩进问题在现代 Ruby 中应该已经过时了,使用了新的 heredoc 语法。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-26
      • 2012-08-25
      • 1970-01-01
      • 1970-01-01
      • 2023-03-07
      • 2011-08-24
      相关资源
      最近更新 更多