我正在开展一项具有以下要求的任务:
Define custom validator that permits first_name or last_name to be null but not both
我有一些有用的东西,但我确信它不正确:
def at_least_one_name
if first_name.nil? && last_name.nil?
errors.add(:first_name, "Must contain at least a first or last name")
end
end
我不知道应该如何完全测试。我上面所说的只是测试两者都是零。事实上,我只是将:first_name
添加到errors数组中,这告诉我已经有些不对劲了。
这会是if/else
吗?那些是在验证中工作吗?
编辑:我正在尝试传递的测试:
it "does not allow a Profile with a null first and last name" do
expect(Profile.new(:first_name=>nil, :last_name=>nil, :gender=>"male")).to_not be_valid
end
it "allows a Profile with a null first name when last name present" do
expect(Profile.new(:first_name=>nil, :last_name=>"Smith", :gender=>"male")).to be_valid
end
it "allows a Profile with a null last name when first name present" do
expect(Profile.new(:first_name=>"Joe", :last_name=>nil, :gender=>"male")).to be_valid
end
答案 0 :(得分:0)
在您的情况下,您使用的是&&
运算符。检查两者。尝试||
而不是检查。改变如下。
def at_least_one_name
if first_name.present? || last_name.present?
errors.add(:first_name, "Must contain at least a first or last name")
end
end
还有其他方法也是这样的:
validates :first_name, presence: true, unless: ->(user){user.last_name.present?}
validates :last_name, presence: true, unless: ->(user){user.first_name.present?}
答案 1 :(得分:0)
使用Dipak G.
提供的信息,我能够找到解决方案:
def at_least_one_name
unless first_name.present? || last_name.present?
errors.add(:user, "Must contain at least a first or last name"
end
end
这有效,并且不会破坏任何其他测试。