我有一张表,并在表格中对唯一性设置进行了验证。例如
创建表帖子( id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY UNIQUE, title varchar(255)unique, 内容文本 );
这里的标题是独一无二的。还需要告知模型类有关这种独特性的信息吗?如果不是我插入重复的标题,它给我错误。我怎么抓住这个。目前rails显示我的回溯,我无法输入我自己的错误消息
def create
@f = Post.new(params[:post])
if @f.save
redirect_to posts_path
else
@flash['message'] = "Duplicated title"
render :action=>'new'
end
end
我没有被重定向到新的,而是显示出一个很大的回溯。
答案 0 :(得分:2)
使用validates_uniqueness_of验证。 “创建记录时,将执行检查以确保数据库中不存在具有指定属性的给定值(映射到列)的记录”
答案 1 :(得分:0)
您必须将所有验证添加到模型中。有一个名为schema_validations的gem,它将检查您的db以进行验证并在您的模型中为您创建它们。 https://github.com/lomba/schema_validations
答案 2 :(得分:0)
是的,如其他答案中所述,答案是validate_uniqueness_of - http://ar.rubyonrails.org/classes/ActiveRecord/Validations/ClassMethods.html#M000086。请注意,即使您在模型中进行了验证,Rails可能会尝试执行两次插入而不知道表中已有唯一记录的竞争条件
创建记录时,会执行检查以确保不记录 记录存在于数据库中,具有指定的给定值 attribute(映射到列)。当记录更新时, 进行同样的检查,但无视记录本身。
因为此检查是在数据库外部执行的,所以仍然存在 重复值将以两个并行方式插入的可能性 交易。为了保证不这一点,你应该创造一个独特的 该领域的指数。有关详细信息,请参阅add_index。
所以你所做的,通过在数据库上创建唯一索引是正确的,尽管你可能会在异常日志中获得数据库驱动程序异常。有解决方法,例如检测插入何时发生(通过双击)。
答案 3 :(得分:0)
Michael Hartl Rails教程涵盖了唯一性验证(例如“电子邮件”字段)here。看来完整的唯一性解决方案是:
:uniqueness
验证添加到模型中。rescue ActiveRecord::StatementInvalid
语句。重新。 #3,看起来迈克尔只是重定向到任何数据库语句异常的主页,所以它不像@Ransom Briggs所建议的解析那么复杂(也不准确),但是如果正如@Omar Qureshi所说的那样可能就足够了,唯一性约束涵盖了99%的案例。