aboutsummaryrefslogtreecommitdiffstats
path: root/actionpack/lib/action_controller/new_base/conditional_get.rb
diff options
context:
space:
mode:
authorYehuda Katz + Carl Lerche <ykatz+clerche@engineyard.com>2009-05-11 10:57:59 -0700
committerYehuda Katz + Carl Lerche <ykatz+clerche@engineyard.com>2009-05-11 10:57:59 -0700
commita2f3684cecb361db2bf5f7ec0b6de0603868ffd5 (patch)
tree792ded3b8c16eb4c47b512712be13171dab0d7e3 /actionpack/lib/action_controller/new_base/conditional_get.rb
parent030dfe3f831aacd60bbfa525dfac4cd5921b6530 (diff)
downloadrails-a2f3684cecb361db2bf5f7ec0b6de0603868ffd5.tar.gz
rails-a2f3684cecb361db2bf5f7ec0b6de0603868ffd5.tar.bz2
rails-a2f3684cecb361db2bf5f7ec0b6de0603868ffd5.zip
Ported fresh_when into a ConditionalGet module
Diffstat (limited to 'actionpack/lib/action_controller/new_base/conditional_get.rb')
-rw-r--r--actionpack/lib/action_controller/new_base/conditional_get.rb42
1 files changed, 42 insertions, 0 deletions
diff --git a/actionpack/lib/action_controller/new_base/conditional_get.rb b/actionpack/lib/action_controller/new_base/conditional_get.rb
new file mode 100644
index 0000000000..16104c51fc
--- /dev/null
+++ b/actionpack/lib/action_controller/new_base/conditional_get.rb
@@ -0,0 +1,42 @@
+module ActionController
+ module ConditionalGet
+
+ # Sets the etag, last_modified, or both on the response and renders a
+ # "304 Not Modified" response if the request is already fresh.
+ #
+ # Parameters:
+ # * <tt>:etag</tt>
+ # * <tt>:last_modified</tt>
+ # * <tt>:public</tt> By default the Cache-Control header is private, set this to true if you want your application to be cachable by other devices (proxy caches).
+ #
+ # Example:
+ #
+ # def show
+ # @article = Article.find(params[:id])
+ # fresh_when(:etag => @article, :last_modified => @article.created_at.utc, :public => true)
+ # end
+ #
+ # This will render the show template if the request isn't sending a matching etag or
+ # If-Modified-Since header and just a "304 Not Modified" response if there's a match.
+ #
+ def fresh_when(options)
+ options.assert_valid_keys(:etag, :last_modified, :public)
+
+ response.etag = options[:etag] if options[:etag]
+ response.last_modified = options[:last_modified] if options[:last_modified]
+
+ if options[:public]
+ cache_control = response.headers["Cache-Control"].split(",").map {|k| k.strip }
+ cache_control.delete("private")
+ cache_control.delete("no-cache")
+ cache_control << "public"
+ response.headers["Cache-Control"] = cache_control.join(', ')
+ end
+
+ if request.fresh?(response)
+ head :not_modified
+ end
+ end
+
+ end
+end \ No newline at end of file