我读过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'
只是为了将主模板文件分成更小的块。
是正确的方法吗?何时/何时我想使用其他辅助函数?
答案 0 :(得分:12)
让我们来看看用例。
这是为了将内容注入可能有用的布局文件中。示例是将其他css /脚本添加到另一个模板的布局中。指南中的示例是相同的,显示如何从任何需要它们的模板将CSS文件添加到布局。您还可以使用它将内容添加到侧边栏,附加链接等。它适用于不需要自己的模板但需要根据显示的视图将信息传递回布局的内容。
render用于显示与路径关联的给定模板。处理路径后,渲染应该用于主要操作。 partial就像是视图中的'方法'。它可以重用,并且可以传递变量来更改输出。您可以在主模板中使用partial来分解代码并重用可能看起来多余的视图片段。
这通常用于创建自己的帮助程序,用于获取内容块。例如,让我们创建一个帮助程序,它接受一个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
为了在模板和直红宝石中正确打印出帮助器中的包装内容,我们可以使用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
我希望这是一个基本的概述。这些函数可以重叠,但一般来说,基于特定的上下文,何时使用它会变得清晰。