2017-02-14 7 views
0

こんにちは、ルビー - 複数のPOSTリクエスト

私は、レール上の内部ルビー(4.1.14)を持って、それに割り当てられた3つのプロセスと乗客/ nginxの上で実行されているアプリ。非常に時折(<時間の5%)私は1回の送信アクションから複数のPOSTを取得します。ログの外観は次のとおりです。

1)ユーザーがGoogle Chromeを使用してbuild_item_interaction#newを訪問しました。これにより、3つのGETリクエストが生成されます。

I, [2017-02-14T13:27:49.679558 #19777] INFO -- : Started GET "/build_item_interactions/new?serial_number=1702R022&type=end_of_line" for 192.168.45.105 at 2017-02-14 13:27:49 -0600 
I, [2017-02-14T13:27:49.681263 #19777] INFO -- : Processing by BuildItemInteractionsController#new as HTML 
I, [2017-02-14T13:27:49.681354 #19777] INFO -- : Parameters: {"serial_number"=>"1702R022", "type"=>"end_of_line"} 
I, [2017-02-14T13:27:49.690776 #19777] INFO -- : Rendered build_item_interactions/_new_interaction.html.erb (4.7ms) 
I, [2017-02-14T13:27:49.690956 #19777] INFO -- : Rendered build_item_interactions/new.html.erb within layouts/application (5.1ms) 
I, [2017-02-14T13:27:49.693310 #19777] INFO -- : Rendered layouts/_login_header.html.erb (1.4ms) 
I, [2017-02-14T13:27:49.693779 #19777] INFO -- : Completed 200 OK in 12ms (Views: 8.6ms | ActiveRecord: 1.0ms) 
I, [2017-02-14T13:27:49.712790 #19777] INFO -- : Started GET "/build_item_interactions/new?serial_number=1702R022&type=end_of_line" for 192.168.45.105 at 2017-02-14 13:27:49 -0600 
I, [2017-02-14T13:27:49.714741 #19777] INFO -- : Processing by BuildItemInteractionsController#new as HTML 
I, [2017-02-14T13:27:49.714852 #19777] INFO -- : Parameters: {"serial_number"=>"1702R022", "type"=>"end_of_line"} 
I, [2017-02-14T13:27:49.722208 #19777] INFO -- : Rendered build_item_interactions/_new_interaction.html.erb (3.5ms) 
I, [2017-02-14T13:27:49.722370 #19777] INFO -- : Rendered build_item_interactions/new.html.erb within layouts/application (3.8ms) 
I, [2017-02-14T13:27:49.724351 #19777] INFO -- : Rendered layouts/_login_header.html.erb (1.2ms) 
I, [2017-02-14T13:27:49.724693 #19777] INFO -- : Completed 200 OK in 10ms (Views: 6.4ms | ActiveRecord: 0.7ms) 
I, [2017-02-14T13:27:49.746169 #19777] INFO -- : Started GET "/build_item_interactions/new?serial_number=1702R022&type=end_of_line" for 192.168.45.105 at 2017-02-14 13:27:49 -0600 
I, [2017-02-14T13:27:49.747577 #19777] INFO -- : Processing by BuildItemInteractionsController#new as HTML 
I, [2017-02-14T13:27:49.747658 #19777] INFO -- : Parameters: {"serial_number"=>"1702R022", "type"=>"end_of_line"} 
I, [2017-02-14T13:27:49.754470 #19777] INFO -- : Rendered build_item_interactions/_new_interaction.html.erb (3.6ms) 
I, [2017-02-14T13:27:49.754647 #19777] INFO -- : Rendered build_item_interactions/new.html.erb within layouts/application (3.9ms) 
I, [2017-02-14T13:27:49.756809 #19777] INFO -- : Rendered layouts/_login_header.html.erb (1.3ms) 
I, [2017-02-14T13:27:49.757209 #19777] INFO -- : Completed 200 OK in 9ms (Views: 6.9ms | ActiveRecord: 0.7ms) 

2)次に、ユーザが2連続でPOSTリクエストを生成しますページの[送信]ボタンをクリック:

2つのレコードを作成し、ユーザーがリソースのに転送されます
I, [2017-02-14T13:27:59.692934 #19777] INFO -- : Started POST "/build_item_interactions?serial_number=1702R022&type=end_of_line" for 192.168.45.105 at 2017-02-14 13:27:59 -0600 
I, [2017-02-14T13:27:59.693996 #19777] INFO -- : Processing by BuildItemInteractionsController#create as HTML 
I, [2017-02-14T13:27:59.694105 #19777] INFO -- : Parameters: {"utf8"=>"?", "authenticity_token"=>"FFs8Uh07oKpvZ57wHzTll/PQxVp0eaK3bVIsOKUDGPU=", "build_item_interaction"=>{"build_item_id"=>"4501 
", "interaction_type_id"=>"5", "data"=>"", "badge"=>["SuxY3ATMMjs"]}, "commit"=>"Save Checkpoint", "serial_number"=>"1702R022", "type"=>"end_of_line"} 
I, [2017-02-14T13:27:59.708826 #19777] INFO -- : Redirected to http://fbdbms/build_items/4501 
I, [2017-02-14T13:27:59.709030 #19777] INFO -- : Completed 302 Found in 15ms (ActiveRecord: 7.0ms) 
I, [2017-02-14T13:27:59.733202 #19777] INFO -- : Started POST "/build_item_interactions?serial_number=1702R022&type=end_of_line" for 192.168.45.105 at 2017-02-14 13:27:59 -0600 
I, [2017-02-14T13:27:59.734318 #19777] INFO -- : Processing by BuildItemInteractionsController#create as HTML 
I, [2017-02-14T13:27:59.734412 #19777] INFO -- : Parameters: {"utf8"=>"?", "authenticity_token"=>"FFs8Uh07oKpvZ57wHzTll/PQxVp0eaK3bVIsOKUDGPU=", "build_item_interaction"=>{"build_item_id"=>"4501 
", "interaction_type_id"=>"5", "data"=>"", "badge"=>["SuxY3ATMMjs"]}, "commit"=>"Save Checkpoint", "serial_number"=>"1702R022", "type"=>"end_of_line"} 
I, [2017-02-14T13:27:59.747852 #19777] INFO -- : Redirected to http://fbdbms/build_items/4501 
I, [2017-02-14T13:27:59.748100 #19777] INFO -- : Completed 302 Found in 14ms (ActiveRecord: 5.7ms) 

3) "所有者" のページ:

I, [2017-02-14T13:27:59.756761 #19777] INFO -- : Started GET "/build_items/4501" for 192.168.45.105 at 2017-02-14 13:27:59 -0600 
I, [2017-02-14T13:27:59.757784 #19777] INFO -- : Processing by BuildItemsController#show as HTML 
I, [2017-02-14T13:27:59.757850 #19777] INFO -- : Parameters: {"id"=>"4501"} 
I, [2017-02-14T13:27:59.809268 #19777] INFO -- : Rendered shared/_rfid_scans_table.html.erb (0.1ms) 
I, [2017-02-14T13:27:59.809422 #19777] INFO -- : Rendered build_items/show.html.erb within layouts/application (41.4ms) 
I, [2017-02-14T13:27:59.811722 #19777] INFO -- : Rendered layouts/_login_header.html.erb (1.3ms) 
I, [2017-02-14T13:27:59.812213 #19777] INFO -- : Completed 200 OK in 54ms (Views: 12.3ms | ActiveRecord: 35.6ms) 

コントローラ内の関連するコードは次のようになります。

class BuildItemInteractionsController < ApplicationController 
    def new 
     load_build_item 
     load_interaction_info 
     if @interaction_info then 
      @interaction = BuildItemInteraction.new(build_item_id: @build_item.try(:id), 
                interaction_type_id: @interaction_info[:id]) 
     end 
    end 
    def create 
     load_build_item 
     load_interaction_info 
     badge = params[:build_item_interaction][:badge] 
     user = Badge.valid_badge(badge) 

     @interaction = BuildItemInteraction.new(params_for_interaction) 
     @interaction.user = user 
     if @interaction.save then 
      flash[:success] = "Record saved" 
      redirect_to @interaction.build_item 
     else  
      err = @interaction.errors.full_messages 
      flash.now[:danger] = "Could not save record: #{err}" 
      render "new" 
     end 
    end 
    private 
     def load_interaction_info 
      @interactions = { "teardown" => { id: 9, description: "End of Teardown" }, 
          "sta4"  => { id: 6, description: "End of Station 4" }, 
          "sta7"  => { id: 7, description: "End of Station 7" }, 
          "sta8"  => { id: 8, description: "End of Test" }, 
          "end_of_line" => { id: 5, description: "End of Line" } } 
      interaction_type = params[:type] 
      @interaction_info = @interactions[interaction_type] 
     end 
     def load_build_item 
      sn = params[:serial_number] 
      @build_item = BuildItem.where(serial_number: sn).first 
     end 
     def params_for_interaction 
      params.require(:build_item_interaction).permit(:build_item_id, :interaction_type_id, :badge, :data) 
     end 
end 

はここで、フォームのコードは次のようになります。

<h2><%= @interaction_info[:description] %> Scan for <%= @build_item.serial_number%></h2> 

<p><%= link_to("Back to Unit Record", @build_item) %></p> 

<div class="well"> 
    <%= simple_form_for(@interaction, 
         :url => build_item_interactions_path(type: "end_of_line", serial_number: @build_item.serial_number), 
         :html => { :class => "form-horizontal" }, 
         wrapper: :horizontal_form, 
         wrapper_mappings: { 
          check_boxes: :horizontal_radio_and_checkboxes, 
          radio_buttons: :horizontal_radio_and_checkboxes, 
          file: :horizontal_file_input, 
          boolean: :horizontal_boolean}) do |f| %> 
     <%= f.association :build_item,  as: :hidden %> 
     <%= f.association :interaction_type, as: :hidden %> 
     <%= f.input  :data, label: "Comments", as: :text %> 


     <div class="form-group select required build_item_interaction_badge"> 
      <label class="select required col-sm-3 control-label" for="build_item_interaction_badge"> 
       <abbr title="required">*</abbr>Badge 
      </label> 
      <div class="col-sm-9"> 
       <%= password_field "build_item_interaction[badge]", nil, class: "string required form-control", 
                      id: "build_item_interaction_badge", 
                      placeholder: "XXXXXXXXXXXX" %> 
       </div> 
     </div> 
     <div class="text-center"> 
      <%= f.submit "Save Checkpoint", data: {disable_with: "Saving..."} %> 
     </div> 
    <% end %> 
</div> 

私は2倍POSTリクエストを取得し終わるなぜ私が把握することはできません。私がやったことのいくつか:

1)データの追加:{disable_with: "Saving ..."}を送信ボタンに追加します。これは、クリックすると機能しているように見えます(ボタンをグレイアウト/無効にします)。

2)私はCSRFトークンを読みました。このトークンの存在が、その第2の要求が処理されないように十分であるように見えます。 Alas - ログでは、両方のリクエストが同じauthentication_tokenで0.1秒以内にヒットし、2つの新しいレコードが取得されます。

提案がありますか?

更新: 私はnginxのアクセスログをチェックして、同様のnginxで処理されている複数の要求があります。

192.168.45.105 - - [14/Feb/2017:13:27:49 -0600] "GET /build_item_interactions/new?serial_number=1702R022&type=end_of_line HTTP/1.1" 499 0 "http://fbdbms/build_items/4501" "Mozilla/5.0 (Windows NT 6 
.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36" "-" 
192.168.45.105 - - [14/Feb/2017:13:27:49 -0600] "GET /build_item_interactions/new?serial_number=1702R022&type=end_of_line HTTP/1.1" 200 1657 "http://fbdbms/build_items/4501" "Mozilla/5.0 (Windows N 
T 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36" "-" 
192.168.45.105 - - [14/Feb/2017:13:27:49 -0600] "GET /build_item_interactions/new?serial_number=1702R022&type=end_of_line HTTP/1.1" 200 1657 "http://fbdbms/build_items/4501" "Mozilla/5.0 (Windows N 
T 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36" "-" 
192.168.45.105 - - [14/Feb/2017:13:27:59 -0600] "POST /build_item_interactions?serial_number=1702R022&type=end_of_line HTTP/1.1" 302 107 "http://fbdbms/build_item_interactions/new?serial_number=170 
2R022&type=end_of_line" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36" "-" 
192.168.45.105 - - [14/Feb/2017:13:27:59 -0600] "POST /build_item_interactions?serial_number=1702R022&type=end_of_line HTTP/1.1" 302 107 "http://fbdbms/build_item_interactions/new?serial_number=170 
2R022&type=end_of_line" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36" "-" 

は、複数のGET要求がおそらくChromeの予測閲覧機能prev discussion hereにリンクされています。これは問題ありませんが、複数のPOSTが問題です。あなたがChromeを使用している場合:ここでは

答えて

1

は、あなたが犯人

に根本原因にブラウザを行うために必要なものです。 F12(Ctrl + Shift + c)を押します。ブラウザNetworkタブで、ブラウザから送信されている要求の数を確認します。GET & POSTリクエスト。あなたは一つだけを見た場合、ブラウザまたはフロントエンドは問題

ないnginxの:サーバーに到達したすべての要求を印刷し、あなたのNginx access logsを確認してください。これが複数の要求を印刷している場合は、ブラウザ&サーバの中に何かがあると思われます。これはLoad Balancerかもしれません。あなたの設定にLBがあるかどうかはわかりません。これが複数のリクエストを出力していない場合は、明らかにNginxやPassengerの設定と関係しているため、リクエストを複製してRailsサーバに送信します。

+0

こんにちは@Gowtham、Chromeは本当に複数のリクエストをしています。私はnginxのログでメインのポストを更新しました。問題は[Chromeの予測ブラウジング](http://stackoverflow.com/questions/4460661/what-to-do-with-chrome-sending-extra-requests)にリンクされているようです。それはGET要求を説明しますが、複数のPOSTは説明しません。 –

+0

こんにちは@GaryPこのフォームを送信するためのJavaScriptコードはありますか、またはそれは通常のブラウザフォームの送信です。それがJSサブミッションの場合は、JSフォームサブミットイベントハンドラでevent.preventDefault(true)を呼び出すことによって、デフォルトのブラウザサブミッションを抑制する必要があります。それ以外の場合は、ダブルサブミッションになります。 – Gowtham