Rails 3.2 を使っています。
ajax で get して、hoge.js.erb で処理をしています。

具体的には商品をどんどん追加していき、最後に submit で POST します。
商品を追加する部分で稀にサーバが 304 を返すのですが、200 でも 304 でも画面上での表示は追加された動きになります。
しかし、 POST 時に 304 が返ってきた商品は欠落(パラメータに含まれない)してしまいます。

考えられる私の案は

  • 304が返ってきたらブラウザ側で描画しないで「エラー発生。もう一度追加してください」的なメッセージ出す
  • ajax_fire_item アクションの時だけサーバ側で 304 を返さず、200 になるような動作にする

です。

ソースを下記に示します。

発火部分の html.erb

function ajax_fire_item(item_id) {
  $.get('<%= root_path -%>bills/ajax_fire_item', {pet_id: <%= @pet.id -%>, item_id: item_id});
}

controller

def ajax_fire_item
  @pet = Pet.find(params[:pet_id])
  @master_item = MasterItem.find(params[:item_id])
end

ajax_fire_item.js.erb

<% form_for([@pet, @pet.bills.build]) do |f|
  fields = f.fields_for(:bill_items, BillItem.new(master_item_id: @master_item.id, quantity: 1), :child_index => Time.now.to_i) do |builder|
    render("bill_item_fields", :f => builder)
  end
  @fields = j fields
end %>
var $item = $("<%= @fields -%>");
$item.appendTo('#item_list');

calcRow($item); // 横計
reCalc(); // 合計欄

試しに発火部分の html.erb を以下の様にしましたが、ログには失敗しても 111 が表示されました。

function ajax_fire_item(item_id) {
  $.ajax('<%= root_path -%>bills/ajax_fire_item',{
      data: {pet_id: <%= @pet.id -%>, item_id: item_id},
      type: 'GET',
      success: function (data, status, xhr) {
        // 成功処理
        console.log(111);
      },
      error: function (data, status, xhr) {
        // 失敗処理. 304error はココに来る!?
        console.log(222);
      }
    }
  );
}