module AbstractController::Layouts::ClassMethods - actionpack-3.2.22 Documentation

# module 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
              <<-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_eval { @_layout if defined?(@_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 "          def _layout
                if conditional_layout?
                  #{layout_definition}
                else
                  #{name_clause}
                end
              end
              private :_layout
    ", __FILE__, __LINE__ + 1
          end

inherited(klass) click to toggle source
Calls superclass method

    # 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