diff options
Diffstat (limited to 'actionpack/lib')
| -rw-r--r-- | actionpack/lib/abstract_controller/translation.rb | 15 | ||||
| -rw-r--r-- | actionpack/lib/action_controller/metal/conditional_get.rb | 60 | ||||
| -rw-r--r-- | actionpack/lib/action_dispatch/journey/router.rb | 1 | 
3 files changed, 51 insertions, 25 deletions
diff --git a/actionpack/lib/abstract_controller/translation.rb b/actionpack/lib/abstract_controller/translation.rb index 02028d8e05..56b8ce895e 100644 --- a/actionpack/lib/abstract_controller/translation.rb +++ b/actionpack/lib/abstract_controller/translation.rb @@ -8,14 +8,15 @@ module AbstractController      # <tt>I18n.translate("people.index.foo")</tt>. This makes it less repetitive      # to translate many keys within the same controller / action and gives you a      # simple framework for scoping them consistently. -    def translate(*args) -      key = args.first -      if key.is_a?(String) && (key[0] == '.') -        key = "#{ controller_path.tr('/', '.') }.#{ action_name }#{ key }" -        args[0] = key +    def translate(key, options = {}) +      if key.to_s.first == '.' +        path = controller_path.tr('/', '.') +        defaults = [:"#{path}#{key}"] +        defaults << options[:default] if options[:default] +        options[:default] = defaults +        key = "#{path}.#{action_name}#{key}"        end - -      I18n.translate(*args) +      I18n.translate(key, options)      end      alias :t :translate diff --git a/actionpack/lib/action_controller/metal/conditional_get.rb b/actionpack/lib/action_controller/metal/conditional_get.rb index febbc72861..28f0b6e349 100644 --- a/actionpack/lib/action_controller/metal/conditional_get.rb +++ b/actionpack/lib/action_controller/metal/conditional_get.rb @@ -57,15 +57,25 @@ module ActionController      # This will render the show template if the request isn't sending a matching ETag or      # If-Modified-Since header and just a <tt>304 Not Modified</tt> response if there's a match.      # -    # You can also just pass a record where +last_modified+ will be set by calling -    # +updated_at+ and the +etag+ by passing the object itself. +    # You can also just pass a record. In this case +last_modified+ will be set +    # by calling +updated_at+ and +etag+ by passing the object itself.      #      #   def show      #     @article = Article.find(params[:id])      #     fresh_when(@article)      #   end      # -    # When passing a record, you can still set whether the public header: +    # You can also pass an object that responds to +maximum+, such as a +    # collection of active records. In this case +last_modified+ will be set by +    # calling +maximum(:updated_at)+ on the collection (the timestamp of the +    # most recently updated record) and the +etag+ by passing the object itself. +    # +    #   def index +    #     @articles = Article.all +    #     fresh_when(@articles) +    #   end +    # +    # When passing a record or a collection, you can still set the public header:      #      #   def show      #     @article = Article.find(params[:id]) @@ -77,18 +87,16 @@ module ActionController      #      #   before_action { fresh_when @article, template: 'widgets/show' }      # -    def fresh_when(record_or_options, additional_options = {}) -      if record_or_options.is_a? Hash -        options = record_or_options -        options.assert_valid_keys(:etag, :last_modified, :public, :template) -      else -        record  = record_or_options -        options = { etag: record, last_modified: record.try(:updated_at) }.merge!(additional_options) +    def fresh_when(object = nil, etag: object, last_modified: nil, public: false, template: nil) +      last_modified ||= object.try(:updated_at) || object.try(:maximum, :updated_at) + +      if etag || template +        response.etag = combine_etags(etag: etag, last_modified: last_modified, +          public: public, template: template)        end -      response.etag          = combine_etags(options)   if options[:etag] || options[:template] -      response.last_modified = options[:last_modified]  if options[:last_modified] -      response.cache_control[:public] = true            if options[:public] +      response.last_modified = last_modified if last_modified +      response.cache_control[:public] = true if public        head :not_modified if request.fresh?(response)      end @@ -123,8 +131,8 @@ module ActionController      #     end      #   end      # -    # You can also just pass a record where +last_modified+ will be set by calling -    # +updated_at+ and the +etag+ by passing the object itself. +    # You can also just pass a record. In this case +last_modified+ will be set +    # by calling +updated_at+ and +etag+ by passing the object itself.      #      #   def show      #     @article = Article.find(params[:id]) @@ -137,7 +145,23 @@ module ActionController      #     end      #   end      # -    # When passing a record, you can still set whether the public header: +    # You can also pass an object that responds to +maximum+, such as a +    # collection of active records. In this case +last_modified+ will be set by +    # calling +maximum(:updated_at)+ on the collection (the timestamp of the +    # most recently updated record) and the +etag+ by passing the object itself. +    # +    #   def index +    #     @articles = Article.all +    # +    #     if stale?(@articles) +    #       @statistics = @articles.really_expensive_call +    #       respond_to do |format| +    #         # all the supported formats +    #       end +    #     end +    #   end +    # +    # When passing a record or a collection, you can still set the public header:      #      #   def show      #     @article = Article.find(params[:id]) @@ -157,8 +181,8 @@ module ActionController      #     super if stale? @article, template: 'widgets/show'      #   end      # -    def stale?(record_or_options, additional_options = {}) -      fresh_when(record_or_options, additional_options) +    def stale?(object = nil, etag: object, last_modified: nil, public: nil, template: nil) +      fresh_when(object, etag: etag, last_modified: last_modified, public: public, template: template)        !request.fresh?(response)      end diff --git a/actionpack/lib/action_dispatch/journey/router.rb b/actionpack/lib/action_dispatch/journey/router.rb index 2b036796ab..e9df984c86 100644 --- a/actionpack/lib/action_dispatch/journey/router.rb +++ b/actionpack/lib/action_dispatch/journey/router.rb @@ -121,6 +121,7 @@ module ActionDispatch          end          def match_head_routes(routes, req) +          routes.delete_if { |route| route.verb == // }            head_routes = match_routes(routes, req)            if head_routes.empty?  | 
