当前,我无法使用nil值创建一个空字段,因为nil被视为唯一。我想做的是,如果字段具有值,那么它必须是唯一的,如果没有,那么它就不能返回空字符串值。
这是我的验证:
validates :subdomain, :allow_nil => true, uniqueness: true
更新
通过此验证,我收到一条错误消息:
子域不能为空
validates_uniqueness_of :subdomain, presence: true, allow_nil: true, if: -> (x) { x.subdomain.present? }
在控制台中没有“ presence:true”的情况下,我可以使用子域nil值创建记录,但是如果在浏览器中执行此操作,它将创建具有空字符串的子域。
答案 0 :(得分:1)
正如@Pavan在评论中所说,您需要有条件地运行此验证。
由于:allow_nil
选项,nil
是一个可接受的值;但是,除非您添加其他检查,否则它将仍然针对此值运行唯一性测试。
我将使用以下代码:
validates :subdomain, allow_nil: true, uniqueness: true, if: -> (x) { x.subdomain.present? }
通常,我认为present?
是包含此内容的一种很好的可读方式。
有了这一点,我敢肯定您还可以通过简单地使用以下方法取消:allow_nil
选项:
validates :subdomain, uniqueness: true, if: -> (x) { x.subdomain.present? }
希望有帮助-让我知道您的生活状况或有任何疑问。
根据评论进行编辑,这是一个拒绝空字符串的示例:
validates :subdomain, allow_nil: true, uniqueness: true, presence: true, if: :subdomain
# or
validates :subdomain, uniqueness: true, presence: true, if: :subdomain
同样,不要认为这里需要:allow_nil
:我已经更新了条件,因此验证仅在record.subdomain
上运行,它将返回true
空字符串,false
代表nil
。
答案 1 :(得分:0)
我的解决方案:
控制器创建方法
@organisation = Organisation.new(params[:organisation].delete_if{ |key, value| !value.present? })
和型号中:
validates :subdomain, :allow_nil => true, uniqueness: true