123456789_123456789_123456789_123456789_123456789_

Module: ActionView::Layouts::ClassMethods

Relationships & Source Files
Namespace Children
Modules:
Defined in: actionview/lib/action_view/layouts.rb

Instance Method Summary

Instance Method Details

#_implied_layout_name (private)

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

Returns

[ GitHub ]

  
# File 'actionview/lib/action_view/layouts.rb', line 345

def _implied_layout_name
  controller_path
end

#_write_layout_method

This method is for internal use only.

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.

[ GitHub ]

  
# File 'actionview/lib/action_view/layouts.rb', line 283

def _write_layout_method # :nodoc:
  silence_redefinition_of_method(:_layout)

  prefixes = /\blayouts/.match?(_implied_layout_name) ? [] : ["layouts"]
  default_behavior = "lookup_context.find_all('#{_implied_layout_name}', #{prefixes.inspect}, false, [], { formats: formats }).first || super"
  name_clause = if name
    default_behavior
  else
    <<-RUBY
      super
    RUBY
  end

  layout_definition = \
    case _layout
    when String
      _layout.inspect
    when Symbol
      <<-RUBY
        #{_layout}.tap do |layout|
          return #{default_behavior} if layout.nil?
          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
      private :_layout_from_proc
      <<-RUBY
        result = _layout_from_proc(#{_layout.arity == 0 ? '' : 'self'})
        return #{default_behavior} if result.nil?
        result
      RUBY
    when false
      nil
    when true
      raise ArgumentError, "Layouts must be specified as a String, Symbol, Proc, false, or nil"
    when nil
      name_clause
    end

  class_eval <<-RUBY, __FILE__, __LINE__ + 1
    # frozen_string_literal: true
    def _layout(lookup_context, formats)
      if _conditional_layout?
        #{layout_definition}
      else
        #{name_clause}
      end
    end
    private :_layout
  RUBY
end

#inherited(klass)

This method is for internal use only.
[ GitHub ]

  
# File 'actionview/lib/action_view/layouts.rb', line 218

def inherited(klass) # :nodoc:
  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

Proc

call the passed Proc

false

There is no layout

true

raise an ArgumentError

nil

Force default layout behavior with inheritance

Return value of Proc and ::Symbol arguments should be ::String, false, true, or nil with the same meaning as described above.

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.

[ GitHub ]

  
# File 'actionview/lib/action_view/layouts.rb', line 269

def layout(layout, conditions = {})
  include LayoutConditions unless conditions.empty?

  conditions.each { |k, v| conditions[k] = Array(v).map(&:to_s) }
  self._layout_conditions = conditions

  self._layout = layout
  _write_layout_method
end