module AbstractController::Layouts::ClassMethods
def _write_layout_method
If a layout is not explicitly mentioned then look for a layout with the controller's name.
Creates a _layout method to be called by _default_layout .
def _write_layout_method remove_possible_method(:_layout) prefixes = _implied_layout_name =~ /\blayouts/ ? [] : ["layouts"] name_clause = if name <<-RUBY lookup_context.find_all("#{_implied_layout_name}", #{prefixes.inspect}).first || super RUBY end if defined?(@_layout) layout_definition = case @_layout when String @_layout.inspect when Symbol <<-RUBY #{@_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 RUBY 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 <<-RUBY 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 RUBY end end self.class_eval <<-RUBY, __FILE__, __LINE__ + 1 def _layout if conditional_layout? #{layout_definition} else #{name_clause} end end private :_layout RUBY end