Namespace
Methods
#
I
L
Included Modules
Instance Public methods
_implied_layout_name()

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

Returns

  • String - A template name

# File actionpack/lib/abstract_controller/layouts.rb, line 266
def _implied_layout_name
  controller_path
end
_write_layout_method()

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 actionpack/lib/abstract_controller/layouts.rb, line 274
      def _write_layout_method
        remove_possible_method(:_layout)

        prefixes    = _implied_layout_name =~ %r\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_variable_get(:@_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)
# File actionpack/lib/abstract_controller/layouts.rb, line 207
def inherited(klass)
  super
  klass._write_layout_method
end
layout(layout, conditions = {})

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 actionpack/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