在我的模型中,我有这个:
validates :name, :presence => true, :uniqueness => true
在我的控制器中我有:
...
if @location.save
format.html { redirect_to @location, :notice => 'Location was successfully created.' }
format.json { render :json => @location, :status => :created }
...
如果表中没有此名称的记录,则会成功创建记录。我认为在插入可能重复的记录之前检查是不错的做法,而不是依赖于数据库约束?
我想我应该向控制器添加一些东西来检查?这样做的正确方法是什么?
非常感谢。
答案 0 :(得分:7)
在记录到达数据库之前,Rails会进行验证。如果记录未通过验证,则不会保存,.save
将返回false
,这将导致控制器的else
子句执行。该子句通常会重新呈现已提交的页面,并显示错误,以便对其进行更正。
假设您的控制器是这样构建的,您不需要做任何其他事情。当然,您应该确保在验证中镜像任何数据库约束,否则记录可能会通过验证,但在保存时会违反约束而产生错误。
答案 1 :(得分:6)
在数据库中添加唯一索引。这样,如果某些内容滑过模型验证(很少见,但技术上可行),保存到数据库的查询将失败。
答案 2 :(得分:5)
你不需要在控制器中做任何事情。
The correct way to prevent duplicate records in Rails is used
validation in model which you did correctly.
答案 3 :(得分:4)
您的验证是正确的。就像上面的所有其他答案一样,但假设您要验证多个字段,例如假设您有一个愿望清单,需要user_id
和item_id
,您需要每个项目只需添加一次对于这种情况,用户将此类验证添加到模型中
Class class_name < ActiveRecord::Base
validates_uniqueness_of :item_id, scope: :user_id
end
答案 4 :(得分:2)
您有正确的方法来验证Rails中的唯一性,这是通过验证。您无需在控制器中进行检查,因为这就是验证对您的影响。
请记住,添加唯一性验证并不能保证您在数据库中拥有唯一的记录。这在api的validates_uniqueness_of documentation中得到了很好的解释。