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 变量传递?还是有更常见的方式?

非常感谢。

【问题讨论】:

请显示&amp;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 =&gt; ...。而在视图中,capture(self, block) 的结果是no block given,所以我猜它一定是capture(self, &amp;block)。我相应地更新了你的帖子。谢谢! 谢谢。我不确定block vs &block,并做了一个猜测。我从问题中获取了渲染语法,但这不是部分的:'bootstrap/navlist'?

以上是关于Rails:重构 HTML 生成辅助方法以使用部分 - 如何在那里使用块?的主要内容,如果未能解决你的问题,请参考以下文章

Ruby on rails 辅助方法实例变量

配置 Ruby on Rails 以生成 .js 而不是 js.coffee [重复]

使用 RSpec 测试 Rails 辅助方法时如何在参数哈希中设置值?

rails 3 - 在javascript响应中转义部分生成的html

如何在 Rails 模块中定义辅助方法?

如何在视图中设置和调用 rails 方法来更新对象的属性