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 actionview/lib/action_view/layouts.rb, line 285
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
super
end
layout_definition = case _layout
when String
_layout.inspect
when Symbol
#{_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
when Proc
define_method :_layout_from_proc, &_layout
private :_layout_from_proc
result = _layout_from_proc(#{_layout.arity == 0 ? '' : 'self'}) return #{default_behavior} if result.nil? result
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 # frozen_string_literal: true def _layout(lookup_context, formats) if _conditional_layout? #{layout_definition} else #{name_clause} end end private :_layout, __FILE__, __LINE__ + 1
end