module AbstractController::Layouts::ClassMethods
def _implied_layout_name
==== Returns
value of this method.
If no layout is supplied, look for a template named the return
def _implied_layout_name controller_path end
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) case defined?(@_layout) ? @_layout : nil when String self.class_eval %{def _layout; #{@_layout.inspect} end}, __FILE__, __LINE__ when Symbol self.class_eval <<-ruby_eval, __FILE__, __LINE__ + 1 def _layout #{@_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 end ruby_eval when Proc define_method :_layout_from_proc, &@_layout self.class_eval %{def _layout; _layout_from_proc(self) end}, __FILE__, __LINE__ when false self.class_eval %{def _layout; end}, __FILE__, __LINE__ when true raise ArgumentError, "Layouts must be specified as a String, Symbol, false, or nil" when nil if name _prefix = "layouts" unless _implied_layout_name =~ /\blayouts/ self.class_eval <<-RUBY, __FILE__, __LINE__ + 1 def _layout if template_exists?("#{_implied_layout_name}", #{_prefix.inspect}) "#{_implied_layout_name}" else super end end RUBY end end self.class_eval { private :_layout } end
def inherited(klass)
def inherited(klass) super klass._write_layout_method end
def layout(layout, conditions = {})
* :only - A list of actions to apply this layout to.
==== Options (conditions)
* String, Symbol, false - The layout to use.
==== Parameters
true:: raise an ArgumentError
false:: There is no layout
the template name
Symbol:: call the method specified by the symbol, which will return
String:: the String is the template name
If the specified layout is a:
Specify the layout to use for this class.
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 || false # Converts nil to false _write_layout_method end