The*_*hop 5 ruby ruby-on-rails active-attr
我正在使用ActiveAttr,它通过块选项为您提供了很好的初始化:
person = Person.new() do |p|
p.first_name = 'test'
p.last_name = 'man'
end
Run Code Online (Sandbox Code Playgroud)
但是,在包含ActiveAttr :: Model的特定类中,我想绕过此功能,因为我想将块用于其他内容.所以我们走了:
class Imperator::Command
include ActiveAttr::Model
end
class MyCommand < Imperator::Command
def initialize(*args, &block)
@my_block = block
super(*args)
end
end
Run Code Online (Sandbox Code Playgroud)
这很难失败,因为块仍然传递到链上,并最终在ActiveAttr内,这段代码运行:
def initialize(*)
super
yield self if block_given?
end
Run Code Online (Sandbox Code Playgroud)
所以,如果我的电话如下:
MyCommand.new() { |date| date.advance(month: 1) }
Run Code Online (Sandbox Code Playgroud)
它失败如下:
NoMethodError: undefined method `advance' for #<MyCommand:0x007fe432c4fb80>
Run Code Online (Sandbox Code Playgroud)
因为MyCommand没有方法:提前调用MyCommand显然失败了.
所以我的问题是,有没有一种方法可以在我super再次调用之前从方法签名中删除块,这样块的行程不会超过我重写的初始化程序?
Fre*_*ung 12
尝试
super(*args,&nil)
Run Code Online (Sandbox Code Playgroud)
&使ruby使用nil作为块和ruby看起来很聪明,意识到这意味着没有块.
| 归档时间: |
|
| 查看次数: |
1359 次 |
| 最近记录: |