在我的模型中,我有这个:
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 }
...
如果表中还没有具有此名称的记录,则会成功创建一条记录。我认为在插入可能重复的记录之前进行检查而不是依赖于DB约束是一个很好的做法。
我想我应该在控制器上添加一些东西来检查一下。做这件事的正确方法是什么?
非常感谢。
5条答案
按热度按时间oipij1gg1#
Rails在记录到达数据库之前进行验证。如果记录验证失败,它将不会保存,
.save
将返回false
,这将导致控制器的else
子句执行。该子句通常会重新呈现已提交的页面,并显示错误以便更正。假设你的控制器是这样构建的,你不需要做任何其他的事情。当然,您应该确保所有数据库约束都反映在验证中,否则记录可能通过验证,但在保存时由于违反约束而产生错误。
xxslljrj2#
在数据库中添加唯一索引。这样,如果有什么东西通过了模型验证(很少,但在技术上是可能的),那么保存到数据库的查询就会失败。
nukf8bse3#
您不需要在控制器中执行任何操作。
jk9hmnmh4#
您的验证是正确的。就像上面的所有其他答案一样,但是假设您想要验证多个字段(例如假设您有一个wishlist,它接受
user_id
和item_id
),您需要每个项目仅由用户添加一次,对于这种情况,将这种类型的验证添加到模型中xghobddn5#
在Rails中,验证唯一性的正确方法是通过验证。你不需要在控制器中检查这个,因为这是验证为你做的。
请记住,添加唯一性验证并不能保证数据库中的记录是唯一的。这在API的validates_unique_of文档中有很好的解释。