Class/Module Index [+]

Quicksearch

AbstractController::Layouts::ClassMethods

Public Instance Methods

_implied_layout_name() click to toggle source

If no layout is supplied, look for a template named the return value of this method.

Returns

  • String - A template name

# File lib/abstract_controller/layouts.rb, line 266
def _implied_layout_name
  controller_path
end
_write_layout_method() click to toggle source

Creates a _layout method to be called by _default_layout .

If a layout is not explicitly mentioned then look for a layout with the controller's name. if nothing is found then try same procedure to find super class's layout.

# File lib/abstract_controller/layouts.rb, line 274
def _write_layout_method
  remove_possible_method(:_layout)

  prefixes    = _implied_layout_name =~ /\blayouts/ ? [] : ["layouts"]
  name_clause = if name
                lookup_context.find_all("#{_implied_layout_name}", #{prefixes.inspect}).first || super
  end

  if defined?(@_layout)
    layout_definition = case @_layout
      when String
        @_layout.inspect
      when Symbol
                        #{@_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
      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_eval { @_layout if defined?(@_layout) }
    @_layout = nil
    inspect  = parent.is_a?(Proc) ? parent.inspect : parent

    layout_definition = if parent.nil?
        name_clause
      elsif name
                        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
      end
  end

  self.class_eval           def _layout            if conditional_layout?              #{layout_definition}            else              #{name_clause}            end          end          private :_layout, __FILE__, __LINE__ + 1
end
inherited(klass) click to toggle source
# File lib/abstract_controller/layouts.rb, line 207
def inherited(klass)
  super
  klass._write_layout_method
end
layout(layout, conditions = {}) click to toggle source

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

nil

Force default layout behavior with inheritance

Parameters

  • layout - The layout to use.

Options (conditions)

  • :only - A list of actions to apply this layout to.

  • :except - Apply this layout to all actions but this one.

# File lib/abstract_controller/layouts.rb, line 251
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

[Validate]

Generated with the Darkfish Rdoc Generator 2.