每天一剂Rails良药之browser_filters

本文介绍了Browser Filters插件,该插件集成了UnicodeContentType、SafariUnicodeFix和LinkPrefetchingBlock三个过滤器,分别用于设置字符集、解决Safari浏览器的Unicode问题及阻止预加载请求。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Rails的acts_as_taggable插件在前面[url=http://hideto.iteye.com/blog/75917]每天一剂Rails良药之Tagging[/url]一文中已经讲到
今天来看看browser_filters插件,它是三个常用的过滤器的集合:
1,UnicodeContentType,设置charset为"text/html; charset=utf-8"
2,SafariUnicodeFix,解决Safari浏览器的Ajax调用的unicde问题
3,LinkPrefetchingBlock,阻塞Google Web Accelerator或其他东西的prefetch,并返回403 Forbidden

我们可以在ApplicationController里[b]include BrowserFilters[/b]或者只[b]include UnicodeContentType, LinkPrefetchingBlock[/b]
让我们看看源码
lib/browser_filters.rb:
[code]
module BrowserFilters
def self.included(controller)
controller.send(:include, LinkPrefetchingBlock, SafariUnicodeFix, UnicodeContentType)
end
end
[/code]
BrowserFilters模块简单的告诉include本身的controller去include具体三个filters

lib/link_prefetching_block.rb:
[code]
module LinkPrefetchingBlock
def self.included(controller)
controller.before_filter(:link_prefetching_block)
end

private
def link_prefetching_block
if request.env["HTTP_X_MOZ"] == "prefetch"
render :nothing => true, :status => "403 Forbidden"
return false
end
end
end
[/code]
LinkPrefetchingBlock模块给include本身的controller加上link_prefetching_block这个before_filter
link_prefetching_block判断如果是GWA等的prefetch则返回403错误

lib/safari_unicode_fix.rb:
[code]
module SafariUnicodeFix
def self.included(controller)
controller.after_filter(:fix_unicode_for_safari)
end

private
def fix_unicode_for_safari
if headers["Content-Type"] == "text/html; charset=utf-8" &&
request.env['HTTP_USER_AGENT'] &&
request.env['HTTP_USER_AGENT'].include?('AppleWebKit') &&
String === response.body &&
!response.body.blank?
response.body = response.body.to_s.gsub(/([^\x00-\xa0])/u) { |s| "&#x%x;" % $1.unpack('U')[0] rescue $1 }
end
end
end
[/code]
SafariUnicodeFix模块给include本身的controller加上fix_unicode_for_safari这个after_filter

lib/unicode_content_type.rb
[code]
module UnicodeContentType
def self.included(controller)
controller.after_filter(:set_content_type)
end

private
def set_content_type
headers["Content-Type"] ||= "text/html; charset=utf-8"
end
end
[/code]
UnicodeContentType模块给include本身的controller加上set_content_type这个after_filter
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值