首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Rails接受重复的POST请求

Rails接受重复的POST请求
EN

Stack Overflow用户
提问于 2012-11-26 12:08:20
回答 2查看 3.1K关注 0票数 6

我的rails应用程序有一个奇怪的问题。我的应用程序在一秒钟内接受重复的POST请求

这个重复的请求包含相同的数据,奇怪地可以绕过我的模型的唯一性验证。这将导致创建两行内容完全相同的数据。

真正令我困惑的是,它每天只发生一次,从昨天开始,我不知道是什么原因造成的。(系统已经在运行,我的客户正在使用这个方法调用,每天使用200到300次,我根本无法复制它)

下面是我的代码片段的情况,并链接到完整的代码,按时间顺序排列

  1. 用户希望创建一个新事务,将在控制器上调用此方法。 def新@penjualan = Penjualan.new @penjualan.kode_transaksi = "J"+ Penjualan.new @customers =Customer.all(:限制=> cookie:limit,( :order=>:kode_kustomer ) @barangs =Barang.all(:限制=> cookie:limit=>cookie:limit)在http://pastebin.com/Lmp7hncn第648行上的respond_to do end format\ format.html # new.html.erb format.json {呈现json:@penjualan } endfull控制器
  2. 在“新”视图中,我已经用:disable_with禁用了按钮,这样用户就不能点击两次提交按钮,从而阻止用户启动双发帖请求。 .row .span4 = f.submit‘散文’,:class=>"btn btn-大型btn-主“,:disable_with =>”处理……“ http://pastebin.com/7b9W68RY第97行的全貌
  3. 提交的请求将调用控制器上的“create”方法,与#1相同的控制器,该方法在1秒的差值上被调用两次。更奇怪的是,这个请求绕过了我在模型上定义的惟一性验证,在模型中,如果第二个请求与第一个请求具有相同的kode_transaksi,那么它就会失败。
  4. 我对我的模型(Penjualan)属性(kode_transaksi)有一个唯一性约束 类Penjualan < ActiveRecord::Base attr_accessible :customer_id,:jatuh_tempo,:kode_transaksi,:no_sj,:tanggal_bayar,:tanggal_transaksi,:total,:total_diskon,:ongkos,:user_id,:status_pembayaran,:is_returned,:kartu_kredit,:kartu_debit has_many :detil_penjualans attr_accessible :cash_total,:kembali belongs_to :customer validates :kode_transaksi,:=> {:message=>{:message=>“Transaksi Sudah Terjadi"} scoped_search :on => :kode_transaksi,:tanggal_transaksi,:status_pembayaran,:tanggal_bayar,:jatuh_tempo,total scoped_search :in => :customer,:on => :nama_kustomer,:kode_kustomer scoped_search :in =>:nama_kustomer,on user,:on :username end
  5. 我的生产日志里有这个案子的片段 开始张贴192.168.1.104在2012年-11-24 12:15:40 +0900的/penjualans作为PenjualansController#create参数:{.太长了,请参阅下面.开始发布192.168.1.104的"/penjualans“在2012年-11-24 12:15:41 +0900由PenjualansController#create作为HTML参数的处理:{.太长了,请参阅下面.}重定向到url/penjualans/17403 Completed 302,在378 to中找到(ActiveRecord: 246.0ms),重定向到url/penjualans/17404完成302,在367 to中找到(ActiveRecord: 233.8ms)。

日志片段( http://pastebin.com/3tpua9gi )

  1. 这种情况在我的数据库中创建了一个重复条目,这会导致问题。

我真的对这种行为感到困惑,而且我已经束手无策了。任何帮助都将不胜感激。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-11-26 12:18:11

为了快速解决这个问题,我建议您在数据库中添加一个唯一的约束(除了模型)。

rails文档显示认为唯一性验证应该伴随着数据库中的唯一约束,以防止两个连接同时插入相同的唯一值的问题。

除此之外,用户快速连续双击表单是否有问题?也许禁用表单不能正常工作,因此允许用户单击两次?

是每天在同一时间还是在特定的时间?

票数 7
EN

Stack Overflow用户

发布于 2012-11-26 12:34:41

这个问题是由Rails中基于模型的唯一性约束的实现方式引起的。基本上,它们的工作方式是询问数据库对于给定的唯一性约束是否存在任何现有行,如果情况如此,则拒绝创建对象。

但是,考虑到常用的事务隔离级别(通常是可重复读取),您可以有重叠的事务,这些事务可以成功地检查约束,然后插入它们的对象,而无需彼此了解。

这是因为为了实现实际的唯一性,来使用UNIQUE索引在数据库中定义约束。这比在模型中定义约束要重要得多,因为只有数据库能够通过检查约束来确保实际的唯一性,因为在多线程操作期间,行实际上是插入/更新的。

关于您仍然希望在Ruby中额外定义约束的唯一原因是,它的错误消息更加友好,因此您可以处理常见的情况。

如果命中了数据库约束而不是Rails约束,那么在调用false时只会得到save,除了失败的数据库约束之外,没有多少信息说明出了什么问题。然而,好处是,您保证以后仍然有一个一致的数据库。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13564562

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档