6

我阅读了http://www.padrinorb.com/guides/application-helpers但我不清楚每个视图助手的用例是什么。具体来说,如何content_for/yield_content, render/partial, capture_html, and concat_content组合在一起?

现在我一直render 'my/view'在我的控制器中使用并在其中加入一些=partial 'my/partial'只是'my/view'为了将主模板文件分解成更小的块。

是正确的方法吗?我什么时候/在哪里想使用其他辅助功能?

4

1 回答 1

12

让我们来看看用例。

  1. content_for/yield_content

这是为了将内容注入可能有用的布局文件中。示例是将其他 css/脚本从另一个模板添加到布局中。指南上的示例是相同的,展示了如何从任何需要 CSS 文件的模板将 CSS 文件添加到您的布局中。您还可以使用它来将内容添加到侧边栏、附加链接等。它适用于不需要自己的模板但需要根据显示的视图将信息传递回布局的内容。

  1. 渲染/部分

render 用于显示与路由关联的给定模板。处理路由后,应将渲染用于主要操作。partial 就像视图中的“方法”。它可以重复使用,并且可以传递变量来更改输出。您在主模板中使用部分来分解代码并重用视图片段,否则这些视图可能看起来是多余的。

  1. capture_html/concat_content

这通常用于创建您自己的获取内容块的助手。例如,让我们创建一个 helper,它接受一个 haml 块并将其包装在一个 div 中。用法如下:

# template.haml
# NOTE the equals so the content is returned 
# and added to the view directly
= div_wrapper do 
  %h1 Some heading
  %p This is now wrapped in a div

要实现这一点并在模板中使用它,您需要能够“捕获”传递到块中的haml,以便处理并在其周围包裹一个div。这就是 capture_html 的用武之地:

def div_wrapper(&block)
   nested_content = capture_html(&block)
   content_tag(:div, nested_content)
end

这将获取内容并将其吐出到包含在 div 中的视图中。现在,假设我们希望这个助手更复杂,所以你希望使用更像这样:

# template.haml
# NOTE the dash so the content is not outputted directly
- div_wrapper do 
  %h1 Some heading
  %p This is now wrapped in a div

但它也适用于其他助手:

# some_helper.rb
def example(name)
  div_wrapper { "<h1>Test</h1>" }
end

为了在模板和直接 ruby​​ 中正确打印出来自帮助程序的包装内容,我们可以使用 concat_content 并检查是否需要将结果“连接”到模板或简单地返回它。

 def div_wrapper(&block)
   nested_content = capture_html(&block)
   tag_result = content_tag(:div, nested_content)
   block_is_template?(block) ? concat_content(tag_result) : tag_result
end

我希望这是一个基本的概述。这些功能可以重叠,但通常会根据具体情况明确何时使用哪个功能。

于 2011-01-21T06:26:24.797 回答