Ruby on rails 跳过nil类Rails 3的唯一性验证
目前,我无法创建具有nil值的空字段,因为nil是唯一的。我想做的是,若字段有值,那个么它必须是唯一的,若为nil,那个么就并没有,而且它不能返回空字符串值 这是我的验证:Ruby on rails 跳过nil类Rails 3的唯一性验证,ruby-on-rails,ruby-on-rails-3,validation,null,Ruby On Rails,Ruby On Rails 3,Validation,Null,目前,我无法创建具有nil值的空字段,因为nil是唯一的。我想做的是,若字段有值,那个么它必须是唯一的,若为nil,那个么就并没有,而且它不能返回空字符串值 这是我的验证: validates :subdomain, :allow_nil => true, uniqueness: true 更新 通过此验证,我收到一条错误消息: 子域不能为空 如果控制台中没有“presence:true”,我可以创建一个具有子域nil值的记录,但如果我在浏览器中这样做,它将创建具有空字符串的子域 正如@
validates :subdomain, :allow_nil => true, uniqueness: true
更新
通过此验证,我收到一条错误消息:
子域不能为空
如果控制台中没有“presence:true”,我可以创建一个具有子域nil值的记录,但如果我在浏览器中这样做,它将创建具有空字符串的子域 正如@Pavan在评论中所说,您需要有条件地运行此验证 由于
:allow_nil
选项,nil
是可接受的值;但是,除非添加额外的检查,否则它仍将针对该值运行唯一性测试
我将使用以下代码:
validates :subdomain, allow_nil: true, uniqueness: true, if: -> (x) { x.subdomain.present? }
通常,我觉得现在?
是一种很好的、可读性强的方法
有了这个选项,我99%确信您也可以取消: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
在那里:我已经更新了条件,因此验证只在记录上运行。子域
,对于空字符串将返回true
,对于nil
将返回false
,我的解决方案:
控制器创建方法
@organisation = Organisation.new(params[:organisation].delete_if{ |key, value| !value.present? })
在模型中:
validates :subdomain, :allow_nil => true, uniqueness: true
请尝试验证:子域,:allow_nil=>true,唯一性:true,if:'!subdomain.nil?“也许您在DB级别上有唯一的约束?尝试保存第二条记录时出现了哪种错误?没有子域简单字符串。错误消息:“子域已被获取”它几乎可以工作,只是它创建了一个空字符串记录,而不是空值。感谢@Kristis的更新-在这种情况下,请确保您在其中包含
:allow_nil
,并将presence:true
添加到选项中。这样将允许使用nil
,但空字符串不允许。我将用一个完整的例子更新我的答案:)子域已被采用,子域不能为空。我通过以下验证得到:validates:subdomain,allow_nil:true,university:true,presence:true,if::subdomain您能帮我一个忙吗?将控制器收到的表单和参数发布到问题中吗?我得赶一赶,不过如果你再加上一点,很可能有人能帮上忙,或者我回来的时候能帮上忙。
validates :subdomain, :allow_nil => true, uniqueness: true