自定义rails验证器,允许两个项中的一个为null,但不能同时为两个

时间:2016-08-01 04:41:23

标签: ruby-on-rails validation

我正在开展一项具有以下要求的任务:

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

2 个答案:

答案 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

这有效,并且不会破坏任何其他测试。