You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 19:32:04