Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ruby-on-rails-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 跳过nil类Rails 3的唯一性验证_Ruby On Rails_Ruby On Rails 3_Validation_Null - Fatal编程技术网

Ruby on rails 跳过nil类Rails 3的唯一性验证

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值的记录,但如果我在浏览器中这样做,它将创建具有空字符串的子域 正如@

目前,我无法创建具有nil值的空字段,因为nil是唯一的。我想做的是,若字段有值,那个么它必须是唯一的,若为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