module AbstractController::Layouts::ClassMethods
def _implied_layout_name
==== Returns
value of this method.
If no layout is supplied, look for a template named the return
def _implied_layout_name controller_path end
def _write_layout_method
If a layout is not explicitly mentioned then look for a layout with the controller's name.
Creates a _layout method to be called by _default_layout .
def _write_layout_method remove_possible_method(:_layout) prefixes = _implied_layout_name =~ /\blayouts/ ? [] : ["layouts"] name_clause = if name <<-RUBY lookup_context.find_all("#{_implied_layout_name}", #{prefixes.inspect}).first || super RUBY end if defined?(@_layout) layout_definition = case @_layout when String @_layout.inspect when Symbol <<-RUBY #{@_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 RUBY when Proc define_method :_layout_from_proc, &@_layout "_layout_from_proc(self)" when false nil when true raise ArgumentError, "Layouts must be specified as a String, Symbol, false, or nil" when nil name_clause end else # Add a deprecation if the parent layout was explicitly set and the child # still does a dynamic lookup. In next Rails release, we should @_layout # to be inheritable so we can skip the child lookup if the parent explicitly # set the layout. parent = self.superclass.instance_variable_get(:@_layout) @_layout = nil inspect = parent.is_a?(Proc) ? parent.inspect : parent layout_definition = if parent.nil? name_clause elsif name <<-RUBY if template = lookup_context.find_all("#{_implied_layout_name}", #{prefixes.inspect}).first ActiveSupport::Deprecation.warn 'Layout found at "#{_implied_layout_name}" for #{name} but parent controller ' \ 'set layout to #{inspect.inspect}. Please explicitly set your layout to "#{_implied_layout_name}" ' \ 'or set it to nil to force a dynamic lookup.' template else super end RUBY end end self.class_eval <<-RUBY, __FILE__, __LINE__ + 1 def _layout if conditional_layout? #{layout_definition} else #{name_clause} end end private :_layout RUBY end
def inherited(klass)
def inherited(klass) super klass._write_layout_method end
def layout(layout, conditions = {})
* :only - A list of actions to apply this layout to.
==== Options (conditions)
* layout - The layout to use.
==== Parameters
nil:: Force default layout behavior with inheritance
true:: raise an ArgumentError
false:: There is no layout
Symbol:: call the method specified by the symbol, which will return the template name
String:: the String is the template name
If the specified layout is a:
Specify the layout to use for this class.
def layout(layout, conditions = {}) include LayoutConditions unless conditions.empty? conditions.each {|k, v| conditions[k] = Array(v).map {|a| a.to_s} } self._layout_conditions = conditions @_layout = layout _write_layout_method end