我想验证user.company.aum_id
。我有
class User < ApplicationRecord
belongs_to :company
validates_associated :company
accepts_nested_attributes_for :company, :image
class Company < ApplicationRecord
has_one :user
validates :aum_id, presence: true, if: 'user.provider?'
但它一直在我的测试中给出这个错误
NoMethodError(未定义的方法`provider?'代表nil:NilClass):
我不想用user && user.provider?
来解决错误。如何检查关联记录是否具有该值,但仅当用户方法#provider?
为真时?就像没有设置company.user一样。它工作正常,值没有验证器保存。
我考虑在User中添加自定义验证器,但看起来您只能在同一模型中指定符号。
http://guides.rubyonrails.org/v5.0/active_record_validations.html#custom-methods
我试过
class User < ApplicationRecord
include ActiveModel::Validations
validates_with AumValidator
app/validators/aum_validator.rb
???路径???
class AumValidator < ActiveModel::Validator
def validate(user)
if user.provider? && user.company.aum_id.blank?
user.errors[:aum_id] << 'Assets Under Management is required.'
end
end
end
但它给出了错误
未初始化的常量User :: AumValidator
Rails 5.0.6
答案 0 :(得分:2)
请尝试使用自定义验证
class User < ApplicationRecord
validate :company_aum_id_present, if: :provider?
private def company_aum_id_present
self.errors[:aum_id] << 'Assets Under Management is required.' if company && company.aum_id.blank?
end
end
此外,当使用自定义验证程序时,您不需要包含ActiveModel::Validations
,因为它已包含在ApplicationRecord
答案 1 :(得分:-1)
class Company < ApplicationRecord
has_one :user
validates :user
validates :aum_id, presence: true, if: -> { user.provider? }
end
在validate方法中使用->
(lambda)使得每次运行验证时都会对其进行评估。
这假定User
实现了provider?
方法或具有名为provider
的属性。
还要求Company
有User
。