cache_fuやmemcachedを使うときに、cacheメソッドがオプションを
受け取ってくれないので不便だなと思っていたのですが、
EdgeRailsでは以下のようなパッチが当たっていて
この問題は解決されているようです。
[PATCH] Rails have poor support to work with memcached
Let's assume we have a caching installation with Nginx used as a frontend. Nginx attempts to get page body by key from memcached. If it succeeds (meaning that the page is in memcached), Rails doesn't get control, making this schema extremely fast, up to 3K requests per second. In case memcached doesn't contain cached page by url as a key, Rails receive control, render page and cache it in memcached in order for the next request to be retrieved from memcached.
現状のリリースバージョンのコードでは、以下のようになっています。
vendor/rails/actionpack/lib/action_view/helpers/cache_helper.rb
rails>>
def cache(name = {}, &block)
@controller.cache_erb_fragment(block, name)
end
<<--
これが、EdgeRailsでは以下のように変更されています。
vendor/rails/actionpack/lib/action_view/helpers/cache_helper.rb
rails>>
def cache(name = {}, options = nil, &block)
template_extension = first_render[/.(\w+)$/, 1].to_sym
case template_extension
when :erb, :rhtml
@controller.cache_erb_fragment(block, name, options)
when :rjs
@controller.cache_rjs_fragment(block, name, options)
when :builder, :rxml
@controller.cache_rxml_fragment(block, name, options)
else
# do a last ditch effort for those brave souls using
# different template engines. This should give plugin
# writters a simple hook.
unless @controller.respond_to?("cache_#{template_extension}_fragment")
raise "fragment caching not supported for #{template_extension} files."
end
@controller.send!("cache_#{template_extension}_fragment", block, name, options)
end
end
<<--