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 400

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 336

def _write_layout_method # :nodoc:
  silence_redefinition_of_method(:_layout)

  prefixes = /\blayouts/.match?(_implied_layout_name) ? [] : ["layouts"]
  default_behavior = "lookup_context.find('#{_implied_layout_name}', #{prefixes.inspect}, false, keys, { formats: formats }) || 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
      layout_proc = ActiveSupport::Ractors.try_shareable_proc(_layout)
      define_method :_layout_from_proc, layout_proc
      private :_layout_from_proc
      <<-RUBY
        result = _layout_from_proc(#{layout_proc.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, keys)
      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 258

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 322

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