Railsアプリケーションに奇妙な問題があります。私のアプリケーションは1秒以内に重複するPOSTリクエストを受け入れます
同じデータを含むこの重複したリクエストは、奇妙なことに私のモデルの一意性の検証をバイパスすることができます。これにより、まったく同じ内容の2行のデータが作成されます。
本当に困惑したのは、昨日から1日1回しか起こらなかったのですが、何が原因なのかわかりません。(システムはすでに稼働しており、クライアントによって使用されています。このメソッド呼び出しは1日に200〜300回使用され、これをまったく再現できません)
これが私のコードスニッペントの状況であり、時系列で完全なコードにリンクしています
ユーザーが新しいトランザクションを作成したい場合、コントローラーでこのメソッドを呼び出します
def new @penjualan = Penjualan.new @penjualan.kode_transaksi = "J"+ DateTime.now.strftime("%d%m%Y%H%M%S")+@active_user.id.to_s @customers = Customer.all(:limit => cookies[:limit], :order=>:kode_kustomer ) @barangs = Barang.all(:limit => cookies[:limit] ) respond_to do |format| format.html # new.html.erb format.json { render json: @penjualan } end end
http://pastebin.com/Lmp7hncn行648の完全なコントローラー
「新規」ビューで、:disable_withを使用してボタンを無効にしました。これにより、ユーザーは送信ボタンを2回クリックできなくなり、ユーザーが二重のPOSTリクエストを開始できなくなります。
.row .span4 = f.submit 'Proses', :class=>"btn btn-large btn-primary", :disable_with => "Processing..."
送信されたリクエストは、#1と同じコントローラーであるコントローラーで「create」メソッドを呼び出します。このメソッドは、1秒の差で2回呼び出されます。さらに奇妙なことに、このリクエストは、モデルで定義した一意性の検証をバイパスします。この場合、最初のリクエストと同じkode_transaksiを持つために2番目のリクエストが失敗することになっています。
モデル(Penjualan)の属性に一意性の制約があります(kode_transaksi)
class 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 :user belongs_to :customer validates :kode_transaksi, :uniqueness =>{: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 => :user, :on => [:username] end
ケースのスニペットを含む私の本番ログ
Started POST "/penjualans" for 192.168.1.104 at 2012-11-24 12:15:40 +0900 Processing by PenjualansController#create as HTML Parameters: {.... too long, see below ....} Started POST "/penjualans" for 192.168.1.104 at 2012-11-24 12:15:41 +0900 Processing by PenjualansController#create as HTML Parameters: {..... too long, see below ....} Redirected to url/penjualans/17403 Completed 302 Found in 378ms (ActiveRecord: 246.0ms) Redirected to url/penjualans/17404 Completed 302 Found in 367ms (ActiveRecord: 233.8ms)
ログのスニペットhttp://pastebin.com/3tpua9gi
- この状況により、データベースに重複エントリが作成され、問題が発生しました
私はこの振る舞いに本当に困惑していて、私は気が遠くなりました。どんな助けでも大歓迎です。