0

我的 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
4

1 回答 1

1

首先,最好使用 javascript 禁用提交按钮。这不仅可以满足您的需求,而且还可以为用户的操作提供良好的反馈。但是您不能依赖它,因为 javascript 可能在 Web 浏览器中被禁用。

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

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

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

注意,除非是分片键,否则分片中不允许唯一索引。因为没有简单的方法可以保证在许多机器中,如果它不是分片键。

于 2013-09-20T21:15:06.927 回答