Ruby:如何实现调用两个现有宏的validates_attr宏?
实现同时调用attr_accessor和validates的validates_attr宏
要实现你要的validates_attr,直接在父类ValidatedObject::Base里定义一个类方法就行——Ruby里的“宏”本质就是类方法,刚好能在类定义阶段帮你触发那两个调用。
具体实现代码
class ValidatedObject::Base def self.validates_attr(attr_name, **validation_options) # 先调用attr_accessor定义属性的读写方法 attr_accessor attr_name # 再调用validates添加对应的验证规则 validates attr_name, validation_options end end
使用示例
就像你期望的那样,现在子类里直接调用这个宏即可:
class Apple < ValidatedObject::Base validates_attr :diameter, type: Float end
这段代码和你改写前的代码效果完全一致:既给Apple类添加了diameter的读写属性,又给该属性绑定了Float类型的验证规则。
关于你的疑问
你问“仅做委托调用是否真的需要编写新宏”——答案是肯定的。因为attr_accessor和validates都是类方法,必须在类定义的上下文里执行,你需要把这两个调用打包成一个新的类方法(也就是宏),才能在子类里用一行代码完成操作。
如果之前写类方法没成功,大概率是这两个原因:
- 没把方法定义在
ValidatedObject::Base父类中,导致子类无法继承调用 - 参数传递有误,比如没正确处理验证选项的关键字参数(用
**接收所有验证参数再传给validates就能解决)
内容的提问来源于stack exchange,提问作者Dogweather
相关产品推荐
相关产品推荐

