次のようなajaxリクエストのX-Messageヘッダーを介してレールでフラッシュメッセージを送信するために、SafariおよびFirefoxでUTF-8文字列を表示する際に問題があります。
class ApplicationController < ActionController::Base
def flash_to_headers
return unless request.xhr?
message = flash_message
message = "#{message.join("','")}" if message.is_a?(Array)
response.headers['X-Message'] = message
response.headers["X-Message-Type"] = flash_type.to_s
flash.discard # don't want the flash to appear when you reload page
end
def flash_message
[:red, :warning, :notice, :success, nil].each do |type|
return "" if type.nil?
return flash[type] unless flash[type].blank?
end
end
def flash_type
[:red, :warning, :notice, :success, nil].each do |type|
return "" if type.nil?
return type unless flash[type].blank?
end
end
ヘッダーを処理する Javascript:
var fade_flash = function() {
$(".flash_alert").fadeIn("fast");
$(".flash_alert").delay(10000).fadeOut("slow");
};
var show_ajax_message = function(msg, type) {
$(".flash_message").html('<div class="flash_alert hidden flash_'+type+'">'+msg+'</div>');
fade_flash();
};
$( document ).ajaxComplete(function(event, request) {
var msg = request.getResponseHeader('X-Message');
var type = request.getResponseHeader('X-Message-Type');
if (msg) {
show_ajax_message(msg, type);
}
});
中国語をサポートする l18n ロケールを追加するまで、これはうまく機能していました。Chrome では引き続き動作しますが、Safari と Firefox では、フラッシュ メッセージが正しく表示されなくなりました。
例: "投注金额” 比你的余额多" のようなメッセージは Chrome では問題なく表示されますが、Safari と Firefox では "âæ注éé¢â æ¯ä½ çä½é¢å¤" のように表示されます。
このバグのライブ デモは、https://ice-dice.comで 見ることができます。中国語ロケールの下で [roll] をクリックするだけで、Chrome を使用しない限り、フラッシュ メッセージが正しくないことがわかります。英語ロケールでは、引用符でさえ正しく表示されません。
よろしくお願いします。