编写一个浮动属性验证时,我偶然发现了一个我总是想验证数值的情况,但在某些情况下只允许使用。
现在我的解决方案通常是allow_nil,但随后编写一个单独的存在验证。
validates :price, numericality: { greater_than: 0 }, allow_nil: true
validates :price, presence: true,
if: Proc.new { |v| v.voting.fan_priced? }
这有效,但似乎并不干净。理想情况下,我想要这样的东西(一种伪代码):
validates :price, numericality: { greater_than: 0 },
allow_nil: Proc.new { |v| v.voting.fan_priced? ? false : true }
但这显然行不通。
有没有办法更有效地做到这一点?我也在SO 上找到了这个,但这看起来很相似,本质上对同一件事使用了两个单独的验证。
PS:不知何故,我验证中的过程弄乱了我的应该匹配器。简单的东西,比如
it { should_not allow_value(0).for(:user_id) }
在同一个模型现在给了我
undefined method `fan_priced?' for nil:NilClass
应该匹配器不能处理过程中的关联吗?