Rails:重构 HTML 生成辅助方法以使用部分 - 如何在那里使用块?
Posted
技术标签:
【中文标题】Rails:重构 HTML 生成辅助方法以使用部分 - 如何在那里使用块?【英文标题】:Rails: Refactoring HTML producing helper method to use a partial - how to use blocks there? 【发布时间】:2012-09-22 10:39:01 【问题描述】:在我之前的问题Developing helper functions that generate html: should I rather use nested content_tag()s or partials? 之后,我现在确信重写我的一些更复杂的 HTML 生成辅助函数以使用模板而不是嵌套的 content_tag()
调用。
这是我原来的助手:
def bootstrap_navlist(&block)
classes = ['nav', 'nav-list']
content_tag(:ul, class: classes.join(' ')) do
capture(self, &block)
end
end
这就是我现在想出的使用部分:
def bootstrap_navlist(&block)
render partial: 'bootstrap/navlist'
end
# views/bootstrap/_navlist.html.erb
<ul class="<%= ['nav', 'nav-list'].join(' ') %>">
How do I output the block here??
</ul>
块看起来像这样,但它可以是任何你喜欢的 HTML:
= bootstrap_navlist do |navlist|
= navlist.item 'Home', '#'
= navlist.sublist 'Meine Favoriten', '/favorites' do |sublist|
如您所料,我不确定如何在视图中输出该块。我是否应该简单地在帮助程序中捕获它并将其作为:local
变量传递?还是有更常见的方式?
非常感谢。
【问题讨论】:
请显示&block
已将其添加到我的问题中,谢谢。
【参考方案1】:
这是一种内容标签没有深度嵌套的情况,作为助手是合理的。
你的助手和部分看起来像这样:
def bootstrap_navlist(&block)
render template: 'bootstrap/navlist', :locals => :block => block
end
<ul class="nav nav-list">
<%= capture(self, &block) %>
</ul>
【讨论】:
必须是render :template => ...
。而在视图中,capture(self, block)
的结果是no block given
,所以我猜它一定是capture(self, &block)
。我相应地更新了你的帖子。谢谢!
谢谢。我不确定block vs &block,并做了一个猜测。我从问题中获取了渲染语法,但这不是部分的:'bootstrap/navlist'?以上是关于Rails:重构 HTML 生成辅助方法以使用部分 - 如何在那里使用块?的主要内容,如果未能解决你的问题,请参考以下文章
配置 Ruby on Rails 以生成 .js 而不是 js.coffee [重复]
使用 RSpec 测试 Rails 辅助方法时如何在参数哈希中设置值?