Ruby on rails Rails-强制字段大写并唯一验证
机场有四个字母的国际民航组织代码。按照惯例,这些都是大写的。我正在创建一个表单来接收用户输入,但是这个表单需要能够在混合情况下接受用户输入,并防止他们创建重复 默认的Ruby on rails Rails-强制字段大写并唯一验证,ruby-on-rails,ruby-on-rails-3,activerecord,validation,Ruby On Rails,Ruby On Rails 3,Activerecord,Validation,机场有四个字母的国际民航组织代码。按照惯例,这些都是大写的。我正在创建一个表单来接收用户输入,但是这个表单需要能够在混合情况下接受用户输入,并防止他们创建重复 默认的:唯一性当然是区分大小写的。我知道如何在保存用户输入之前将其转换为大写,但问题是这似乎是后验证,而不是预验证 例如,如果已经有一个机场的ICAO为KLAX,用户可以输入KLAX,它将被验证为唯一的,然后转换为大写并存储,从而产生重复 这是我目前的模型代码 class Airport < ActiveRecord::Base
:唯一性
当然是区分大小写的。我知道如何在保存用户输入之前将其转换为大写,但问题是这似乎是后验证,而不是预验证
例如,如果已经有一个机场的ICAO为KLAX
,用户可以输入KLAX
,它将被验证为唯一的,然后转换为大写并存储,从而产生重复
这是我目前的模型代码
class Airport < ActiveRecord::Base
validates :icao, :name, :lat, :lon, :presence => true
validates :icao, :uniqueness => true
before_save :uppercase_icao
def uppercase_icao
icao.upcase!
end
end
class Airporttrue
验证:icao,:唯一性=>true
保存前:大写字母
def大写字母_国际民航组织
国际民航组织,快!
结束
结束
试试这个:
validates :icao, :uniqueness => { :case_sensitive => false }
简单地解决了(Rails的许多问题)-正如Danny在上面指出的,虽然不是在他自己的答案中,所以我不能接受:),将保存之前的
更改为验证之前的可以很好地修复它。或稍微不同的做法:为icao
编写一个setter,将抛出的任何内容转换为大写:
def icao=(val)
self[:icao] = val.upcase
end
然后可以使用常规唯一性验证()。甚至可能使DB在查找过程中变得更容易,因为它不再需要担心不区分大小写的比较
希望这有帮助 Rails 4的更新答案
class Airporttrue
验证:icao,:唯一性=>{区分大小写:false}
def icao=(val)
写入属性:icao,val.upcase
结束
结束
或者在保存之前进行验证,而不是在保存之前进行验证:)很好,Danny-验证之前正是我所需要的。谢谢,这也是一种有趣的处理方式。出于某种原因,我也没有假设我需要手动索引我的字段,所以很高兴知道这一点。很容易做到,但很重要!谢谢