我的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)
。
我的初始化程序有什么问题?
答案 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