aboutsummaryrefslogtreecommitdiffstats
path: root/actionpack/lib/action_controller/abstract/layouts.rb
diff options
context:
space:
mode:
Diffstat (limited to 'actionpack/lib/action_controller/abstract/layouts.rb')
-rw-r--r--actionpack/lib/action_controller/abstract/layouts.rb164
1 files changed, 0 insertions, 164 deletions
diff --git a/actionpack/lib/action_controller/abstract/layouts.rb b/actionpack/lib/action_controller/abstract/layouts.rb
deleted file mode 100644
index f021dd8b62..0000000000
--- a/actionpack/lib/action_controller/abstract/layouts.rb
+++ /dev/null
@@ -1,164 +0,0 @@
-module AbstractController
- module Layouts
- extend ActiveSupport::Concern
-
- include Renderer
-
- included do
- extlib_inheritable_accessor(:_layout_conditions) { Hash.new }
- _write_layout_method
- end
-
- module ClassMethods
- def inherited(klass)
- super
- klass._write_layout_method
- end
-
- # Specify the layout to use for this class.
- #
- # If the specified layout is a:
- # String:: the String is the template name
- # Symbol:: call the method specified by the symbol, which will return
- # the template name
- # false:: There is no layout
- # true:: raise an ArgumentError
- #
- # ==== Parameters
- # layout<String, Symbol, false)>:: The layout to use.
- #
- # ==== Options (conditions)
- # :only<#to_s, Array[#to_s]>:: A list of actions to apply this layout to.
- # :except<#to_s, Array[#to_s]>:: Apply this layout to all actions but this one
- def layout(layout, conditions = {})
- conditions.each {|k, v| conditions[k] = Array(v).map {|a| a.to_s} }
- self._layout_conditions = conditions
-
- @_layout = layout || false # Converts nil to false
- _write_layout_method
- end
-
- # If no layout is supplied, look for a template named the return
- # value of this method.
- #
- # ==== Returns
- # String:: A template name
- def _implied_layout_name
- name.underscore
- end
-
- # Takes the specified layout and creates a _layout method to be called
- # by _default_layout
- #
- # If there is no explicit layout specified:
- # If a layout is found in the view paths with the controller's
- # name, return that string. Otherwise, use the superclass'
- # layout (which might also be implied)
- def _write_layout_method
- case @_layout
- when String
- self.class_eval %{def _layout(details) #{@_layout.inspect} end}
- when Symbol
- self.class_eval <<-ruby_eval, __FILE__, __LINE__ + 1
- def _layout(details)
- #{@_layout}.tap do |layout|
- unless layout.is_a?(String) || !layout
- raise ArgumentError, "Your layout method :#{@_layout} returned \#{layout}. It " \
- "should have returned a String, false, or nil"
- end
- end
- end
- ruby_eval
- when false
- self.class_eval %{def _layout(details) end}
- when true
- raise ArgumentError, "Layouts must be specified as a String, Symbol, false, or nil"
- when nil
- self.class_eval <<-ruby_eval, __FILE__, __LINE__ + 1
- def _layout(details)
- if view_paths.find_by_parts?("#{_implied_layout_name}", details, "layouts")
- "#{_implied_layout_name}"
- else
- super
- end
- end
- ruby_eval
- end
- self.class_eval { private :_layout }
- end
- end
-
- private
- # This will be overwritten by _write_layout_method
- def _layout(details) end
-
- # Determine the layout for a given name and details.
- #
- # ==== Parameters
- # name<String>:: The name of the template
- # details<Hash{Symbol => Object}>:: A list of details to restrict
- # the lookup to. By default, layout lookup is limited to the
- # formats specified for the current request.
- def _layout_for_name(name, details = {:formats => formats})
- name && _find_layout(name, details)
- end
-
- # Take in the name and details and find a Template.
- #
- # ==== Parameters
- # name<String>:: The name of the template to retrieve
- # details<Hash>:: A list of details to restrict the search by. This
- # might include details like the format or locale of the template.
- #
- # ==== Returns
- # Template:: A template object matching the name and details
- def _find_layout(name, details)
- # TODO: Make prefix actually part of details in ViewPath#find_by_parts
- prefix = details.key?(:prefix) ? details.delete(:prefix) : "layouts"
- view_paths.find_by_parts(name, details, prefix)
- end
-
- # Returns the default layout for this controller and a given set of details.
- # Optionally raises an exception if the layout could not be found.
- #
- # ==== Parameters
- # details<Hash>:: A list of details to restrict the search by. This
- # might include details like the format or locale of the template.
- # require_layout<Boolean>:: If this is true, raise an ArgumentError
- # with details about the fact that the exception could not be
- # found (defaults to false)
- #
- # ==== Returns
- # Template:: The template object for the default layout (or nil)
- def _default_layout(details, require_layout = false)
- if require_layout && _action_has_layout? && !_layout(details)
- raise ArgumentError,
- "There was no default layout for #{self.class} in #{view_paths.inspect}"
- end
-
- begin
- _layout_for_name(_layout(details), details) if _action_has_layout?
- rescue NameError => e
- raise NoMethodError,
- "You specified #{@_layout.inspect} as the layout, but no such method was found"
- end
- end
-
- # Determines whether the current action has a layout by checking the
- # action name against the :only and :except conditions set on the
- # layout.
- #
- # ==== Returns
- # Boolean:: True if the action has a layout, false otherwise.
- def _action_has_layout?
- conditions = _layout_conditions
- if only = conditions[:only]
- only.include?(action_name)
- elsif except = conditions[:except]
- !except.include?(action_name)
- else
- true
- end
- end
- end
-end