【问题标题】:Can't suppress output in nested block helper in rails 3无法抑制 Rails 3 中嵌套块助手中的输出
【发布时间】:2010-12-04 05:47:42
【问题描述】:

这个有点扭曲我的面条。

我有类似的东西(如果重要的话,在 Rails 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 应该可以解决这个确切的问题。我很确定问题源于我调用捕获的方式(来自包含ActionView::Helpers 的虚拟代理类),但问题是b.foo 调用正在调用类实例上的方法,而不是来自某事物的上下文这将被混合到模板中。

有没有办法解决这个问题?还是我从错误的方向接近这个。我正在尝试对一些相当复杂的东西进行建模,并且对 api 非常满意,但似乎无法解决这个问题。

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-3


    【解决方案1】:

    如果你修改辅助方法以传入self,这将是当前视图实例,然后使用它来捕获,你可能不会遇到这个问题。用您使用的帮助器替换提供的视图实例。

    【讨论】:

    • 这是一个绝妙的主意 :D 效果很好
    • 这让我发疯了...感谢您的解决方案!
    • @SubbaRao 在这种情况下,解决方案可能是更改Builder#initialize 以将helper 作为参数,将其分配给@helper,然后不调用capture,而是调用@ 987654325@。然后,在实例化新的 Builder 时,使用 Builder.new(self)(如果从 ApplicationHelper 模块中的方法实例化)。
    猜你喜欢
    • 2011-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-30
    相关资源
    最近更新 更多