_write_layout_method()
public
Takes the specified layout and
creates a _layout method to be called by _default_layout
If there is no explicit layout
specified: If a layout is
found in the view paths with the controller’s name, return that
string. Otherwise, use the superclass’ layout
(which might also be implied)
Show source
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 "def _layout\n\#{@_layout}.tap do |layout|\nunless layout.is_a?(String) || !layout\nraise ArgumentError, \"Your layout method :\#{@_layout} returned \\\#{layout}. It \" \\\n\"should have returned a String, false, or nil\"\nend\nend\nend\n", __FILE__, __LINE__ + 1
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 "def _layout\nif template_exists?(\"\#{_implied_layout_name}\", \#{_prefix.inspect})\n\"\#{_implied_layout_name}\"\nelse\nsuper\nend\nend\n", __FILE__, __LINE__ + 1
end
end
self.class_eval { private :_layout }
end