Ruby on rails Rails Mongoid如何验证数据库中的新条目以防止重复?

Ruby on rails Rails Mongoid如何验证数据库中的新条目以防止重复?,ruby-on-rails,mongodb,validation,mongoid,form-submit,Ruby On Rails,Mongodb,Validation,Mongoid,Form Submit,我的Rails应用程序有一个问题,如果用户单击表单上的提交,然后停止浏览器继续(KILL_CURSOR),如果他们重新提交表单,它将在数据库中创建一个重复条目。我已经尝试过在提交后安装javascript来禁用输入,但在这个用例中不起作用 我是否有办法验证表单是否是重新提交的,即使它具有相同的真实性标记 这是我的控制器: def create @location = Location.new(params[:location]) @location.user_id = current_use

我的Rails应用程序有一个问题,如果用户单击表单上的提交,然后停止浏览器继续(KILL_CURSOR),如果他们重新提交表单,它将在数据库中创建一个重复条目。我已经尝试过在提交后安装javascript来禁用输入,但在这个用例中不起作用

我是否有办法验证表单是否是重新提交的,即使它具有相同的真实性标记

这是我的控制器:

def create
 @location = Location.new(params[:location])
 @location.user_id = current_user.id  

 if @location.save
  #refresh window to show new location
  render :js => "window.location.reload();"      
 #check that form fields have been completed properly
 else
  respond_to do |format|
  format.js
 end
end

首先,最好使用javascript禁用submit按钮。这不仅满足了您的需求,而且还为用户提供了良好的行动反馈。但您不能依赖于此,因为javascript可能在web浏览器中被禁用

在插入新文档之前,可以检查数据库以查看是否已经存在重复的文档。关键是复制的定义基于您的业务逻辑。例如,在5分钟内,来自同一用户的关于同一位置的两个请求被复制。但是,在极端情况下,两个或多个并发请求可能会导致重复的文档,因为它们可能同时检查数据库,什么也看不到,然后插入

在数据库层,如果数据的某些字段本身定义了重复,并且应该是唯一的,那么在MongoDB中可能会有所帮助。例如,给定位置的给定用户在数据库中最多只能出现一次。构建一个唯一的索引
(用户id、位置id)
可以保证这种约束

db.collection.ensureIndex( { user_id: 1, location._id: 1 }, { unique: true } )

注意:除非是分片键,否则分片中不允许使用唯一索引。因为在许多机器中,如果不是shard键,就没有简单的方法来保证这一点。

谢谢@visualzhou,我使用mongoid在模型类中添加了以下内容:
索引({user\u id:1,id:1},{unique:true})
而且似乎不起作用,用户仍然能够单击浏览器后退按钮并重新提交表单,不会提示他们记录已经创建。