Rails 6.1中非数据库属性acceptance验证始终通过的问题
Rails 6.1非数据库属性验证失效的解决方法
问题根源
你的account_authorization是非数据库属性,但没有在模型中声明attr_accessor :account_authorization,导致Rails无法识别这个属性的存在——acceptance验证会直接跳过对未定义属性的检查,所以哪怕你把它设为nil,验证也会默认通过。
修正后的模型代码
给模型添加属性存取器,让Rails能识别这个非数据库属性:
class BankAccount < ApplicationRecord belongs_to :donor # 声明非数据库属性的读写方法 attr_accessor :account_authorization before_validation -> { puts "#AccAuth: #{account_authorization}" } validates :account_authorization, acceptance: { accept: [true, 'true', '1'] } end
优化验证逻辑(可选)
Rails的acceptance验证默认允许nil值,如果你希望nil直接判定为无效,可以加上allow_nil: false选项:
validates :account_authorization, acceptance: { accept: [true, 'true', '1'] }, allow_nil: false
这样当account_authorization为nil时,验证会直接失败,完全匹配你的测试预期。
测试代码说明
你的Rspec测试用例本身没有问题,修正模型后,测试会输出valid? false并通过断言。
内容的提问来源于stack exchange,提问作者aarkerio
相关产品推荐
相关产品推荐

