「304 Not Modified」をハンドリングしたい
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);
}
}
);
}