instance method _write_layout_method

Ruby on Rails 3.2.22.5

Since v3.0.20 Last seen in v3.2.22.5

Available in: v3.0.20 v3.1.12 v3.2.22.5

Signature

_write_layout_method()

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.

Source
# 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
          <<-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

Defined in actionpack/lib/abstract_controller/layouts.rb line 274 · View on GitHub · Improve this page · Find usages on GitHub

Defined in AbstractController::Layouts::ClassMethods

Type at least 2 characters to search.

↑↓ navigate · open · esc close