method
_write_layout_method
v3.2.13 -
Show latest stable
- Class:
AbstractController::Layouts::ClassMethods
_write_layout_method()public
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 =~ /\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_eval { @_layout if defined?(@_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 Related methods
- Instance methods
- _implied_layout_name
- _write_layout_method
- inherited
- layout