在Ruby中的对象初始值设定项中捕获块

时间:2014-01-28 15:56:08

标签: ruby-on-rails ruby

我的rails应用程序中有一个类Notification::Pseudo,它有一个自定义initialize方法。我希望这种方法能够捕获传递给new的块的输出,并将其用作@message的值

class Notification::Pseudo
  attr_accessor :message
  def initialize(&block)
    @message = begin
      capture(&block) if block_given?
    end || ""
  end
end

在我看来,我有类似

的东西
- notification = Notification::Pseudo.new do
  This is a test!

但这不起作用。这给了我错误ArgumentError: wrong number of arguments (0 for 1)

我的初始化程序有什么问题?

1 个答案:

答案 0 :(得分:2)

您正在调用的

capture方法是在内核模块上定义的。您想从capture模块中致电ActionView::Helpers::CaptureHelper。它自动包含在视图上下文中,您需要在此上下文中运行它,因此您需要:

class Notification::Pseudo
  attr_accessor :message
  def initialize(vc, &block)
    @message = begin
      vc.capture(&block) if block_given?
    end || ""
  end
end

#In your view

- notification = Notification::Pseudo.new self do
  This is a test!

更新:

要使其在视图之外工作,请执行:

class Notification::Pseudo
  attr_accessor :message
  def initialize(vc = nil, &block)
    @message = begin
      return unless block_given?
      vc ? vc.capture(&block) : block.call
    end || ""
  end
end