Top > Ruby on Railsあれこれ > 2-7 二重のお買い物を防止しよう

  0
<%= double_submit_token %>
  0
  1
  2
  3
  4
  5
  6
  7
  8
  9
------------
<%# 2-6で追加しました。%>
<% form_tag({:action => 'commit'}) do %>
  数量変更は有効になりません。数量を変更してから購入ボタンを押してください。<br>
  ユーザ名<%= text_field_tag "userid" %>
  <%# 2-7で追加しました。ダブルサブミット防止用トークンを出力します%>
  <%= double_submit_token %>
  <%= submit_tag "購入する" %>
<% end %>
------------
  0
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
--------------------------------------------
  #2-6で追加
  #1)「購入する」ボタンクリック時のアクション
  #本メソッド正常終了時にセッションに格納されていたカートは削除されます。
  def commit
    
    #2-7で追加
    #不正なトークンかチェックする
    if double_submit?
      render :action => 'twice.html.erb'
      return
    end
    
    @userid = params[:userid]
    @cart = session[:cart]
    
    begin
      #トランザクション開始
      ActiveRecord::Base.transaction {
      
        shopping = Shopping.new
        shopping.userid = @userid
        #1) save!ではDB処理失敗時に例外が発生します。
        shopping.save!
      
        @cart.catalogs.each_with_index { |c, i|
            d = Shoppingdetails.new
            d.shoppingid = shopping.id
            d.no = i+1
            d.productid = c.id
            d.counts = c.count
            d.save!
        }
      }
    rescue => ex
        #例外発生時の処理を記述します。
        render :text => ex
        return
    end
    
    session[:cart] = nil
  end
  0
  1
  2
  3
  4
  5
  6
  7
  8
  9
<html>
<body>
2度続けてボタンが押されたか、リロードされたようです。一回だけお買い上げいただくように処理しました。<br>
もう一度同じ内容でお買い物される際はお手数ですが、商品をカートに入れていただいて処理して下さい。<br>
 
お買い上げありがとうございました。
 
<%= link_to( "商品一覧へ戻る", {:controller => 'catalogs', :action => 'index'}) %>
</body>
</html>

添付ファイル: fileror-sample2-7_2.jpg 216件 [詳細] fileror-sample2-7_1.jpg 235件 [詳細]

リロード   新規 編集 凍結解除 差分 添付 複製 名前変更   ホーム 一覧 単語検索 最終更新 バックアップ リンク元   ヘルプ   最終更新のRSS
Last-modified: 2012-08-08 (水) 23:25:35 (2923d)