附加Content_For的HAML / Ruby Loop变量

时间:2014-02-17 15:26:44

标签: ruby haml middleman

基本上有一个YAML产品文件

# Product - Granola Bar
-   title       : "Granola Bar"
    excerpt     : "Comes in several amazing varieties including nut, and delicious fruit."
    description : "Comes in several amazing varieties including nut, and delicious fruit."
    image       : "granola-bar.jpg"
    cost        : "3.50"
    discount    : "2.50"
    stock       : "100"
    ingredients :
        - value : key

# Product - Granola Bar
-   title       : "Hazelnut Spread"
    excerpt     : "Chocolate"
    description : "Chocolate"
    image       : "hazelnut-spread.jpg"
    cost        : "2.50"
    discount    : "1.50"
    stock       : "100"
    ingredients :
        - value : key

现在,当我遍历这些内容时,内容将被附加到前一个内容变量。

即。 “有几种令人惊奇的品种,包括坚果和美味的水果.3.50” “有几种令人惊奇的品种,包括坚果和美味的水果.3.50巧克力2.50”

应该是 “有几种令人惊奇的品种,包括坚果和美味的水果.3.50” 然后 “巧克力2.50”

-# Create new array for the thumbnails
- thumbnails  = []

-# Loop through the array
- data.products.each do | product |

    -# Content
    - content_for :content do

        -# Excerpt
        = product.excerpt

        -# Cost
        = product.cost

    - content = yield_content :content

    - thumbnails << { :"data-src" => "holder.js/300x200/auto",
                      :caption    => content,
                      :title      => product.title }

Ruby非常新,所以不确定要搜索什么 - 循环中的可变变量?我尝试在循环之前推送content = nil,并且在每次传递时也尝试取消设置

任何帮助表示感谢。

屏幕显示正在发生的事情 - 显然不应该在第二个缩略图中加倍 enter image description here

使用正确的版本编辑 - 我想保存Content_For以推送到Partial。很抱歉将此问题排除在原始问题之外。

2 个答案:

答案 0 :(得分:2)

content_for用于捕获在其他地方使用的内容。

IE在您的应用程序布局中有一个yield_content :title,并将其设置为当前呈现的部分:

# index.haml
- content_for :title, "I'm on the index page"

你的例子根本不应该使用content_for!它应该只是将字符串呈现在输出中:

- data.products.each do |product|
  = product.excerpt
  = product.cost

如果你想在img_tag助手或类似的东西中使用那个输出,那么如果逻辑更复杂,那么使用辅助方法生成内容或将其放入自己的部分中。

您也可以在视图代码中分配新变量,稍后再使用它们。

- caption = "#{product.excerpt} #{product.cost}"

我觉得你的例子中根本不需要这样的东西!也许那是因为你实际上从未在任何地方使用thumbnails ......

答案 1 :(得分:-1)

最后我改为使用capture_html

    -# Loop through the array
- data.products.each do | product |

    -# Content
    - capture = capture_html do

        -# Excerpt
        %p
            = product.excerpt

        -# Page Name
        - page = product.title.downcase.gsub( /[^a-z0-9\- ]/, ' ').gsub( / /, '-' )

        -# Button
        = partial "bootstrap/css/button",
                   :locals => { :color      => "primary",
                                :content    => "View Product",
                                :extraClass => "pull-right",
                                :href       => "/shop/#{ page }" }

        -# Cost
        %p.text-left.price
            &pound;
            = product.cost

        .clearfix

    - thumbnails << { :"data-src" => "holder.js/300x200/auto",
                      :caption    => capture,
                      :title      => product.title  }