Namespace
Methods
Included Modules
Instance Public methods
If no layout is supplied, look for a template named the return value of this method.
Returns
-
String
- A template name
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 =~ %r\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_variable_get(:@_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
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, which will return the template name
- false
-
There is no layout
- true
-
raise an ArgumentError
- nil
-
Force default layout behavior with inheritance
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.
# File actionpack/lib/abstract_controller/layouts.rb, line 251 def layout(layout, conditions = {}) include LayoutConditions unless conditions.empty? conditions.each {|k, v| conditions[k] = Array(v).map {|a| a.to_s} } self._layout_conditions = conditions @_layout = layout _write_layout_method end