这个有点扭曲我的面条。
我有类似的东西(如果重要的话,在轨道3引擎中)
class Builder
def initialize
@foos = []
end
def foo(&block)
@foos << helper.capture(&block) #helper being a class that is including ActionView::Helpers
end
def to_html
@foos.join "\n"
end
end
module ApplicationHelper
def widget
b = Builder.new
yield b
b.to_html
end
end
#in a view somewhere
<%= widget do |b| %>
<% b.foo do %>
static content
<% end %>
<% end %>
一切都很好,但是嵌套的静态内容会输出两次 - 一次是我想要的,一次是调用widget
。
根据我的阅读,capture
应该处理这个确切的问题。我很确定问题源于我如何调用capture(来自包含ActionView::Helpers
的虚拟代理类),但问题是b.foo
调用是在类实例上调用方法,而不是从将混合到模板中的内容的上下文。
有没有办法解决这个问题?或者我是从错误的方向接近这个。我试图模拟一些相当复杂的东西,我对api非常满意,似乎无法通过这个问题。
答案 0 :(得分:2)
如果修改helper方法以传入self(即当前视图实例),然后使用它来捕获,则可能没有此问题。将您对助手的使用替换为提供的视图实例。