Class: Hanami::View::Rendering::LayoutScope

Inherits:
BasicObject
Defined in:
gems/gems/hanami-view-1.3.0/lib/hanami/view/rendering/layout_scope.rb

Overview

Scope for layout rendering

Since:

  • 0.1.0

Direct Known Subclasses

Scope

Instance Method Summary collapse

Dynamic Method Handling

This class handles dynamic methods through the method_missing method

#method_missing(m, *args, &blk) ⇒ Object (protected)

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

Forward all the missing methods to the view scope or to the layout.

Examples:

# In the layout template:
#   templates/application.html.erb
#
# Use like this:
<title><%= article.title %></title>

# `article` will be looked up in the view scope first.
# If not found, it will be searched within the layout.

See Also:

Since:

  • 0.1.0

def method_missing(m, *args, &blk)
  # FIXME: this isn't compatible with Hanami 2.0, as it extends a view
  # that we want to be frozen in the future
  #
  # See https://github.com/hanami/view/issues/130#issuecomment-319326236
  if @scope.respond_to?(m, true) && @scope.locals.has_key?(m) && layout.respond_to?(m, true)
    layout.__send__(m, *args, &blk)
  elsif @scope.respond_to?(m, true)
    @scope.__send__(m, *args, &blk)
  elsif layout.respond_to?(m, true)
    layout.__send__(m, *args, &blk)
  else
    ::Hanami::View::Escape.html(super)
  end
end

Instance Method Details

#classObject

Returns the classname as string

Returns:

  • classname

Since:

  • 0.3.0

def class
  (class << self; self end).superclass
end

#formatSymbol

Returns the requested format.

Returns:

  • (Symbol)

    the requested format (eg. :html, :json, :xml, etc..)

Since:

  • 0.1.0

def format
  @scope.format
end

#inspectString

Returns an inspect String

Returns:

  • (String)

    inspect String (contains classname, objectid in hex, available ivars)

Since:

  • 0.3.0

def inspect
  base = "#<#{ self.class }:#{'%x' % (self.object_id << 1)}"
  base << " @layout=\"#{@layout.inspect}\"" if @layout
  base << " @scope=\"#{@scope.inspect}\"" if @scope
  base << ">"
end

#local(key) ⇒ Object, Hanami::View::Rendering::NullLocal

It tries to invoke a method for the view or a local for the given key. If the lookup fails, it returns a null object.

Examples:

Safe method navigation

<% if local(:plan).overdue? %>
  <h2>Your plan is overdue.</h2>
<% end %>

Optional Contents

# Given the following layout template

<!doctype HTML>
<html>
  <!-- ... -->
  <body>
    <!-- ... -->
    <%= local :footer %>
  </body>
</html>

# Case 1:
#   Products::Index doesn't respond to #footer, local will return nil
#
# Case 2:
#   Products::Show responds to #footer, local will send back
#     #footer returning value

module Products
  class Index
    include Hanami::View
  end

  class Show
    include Hanami::View

    def footer
      "contents for footer"
    end
  end
end

Returns:

Since:

  • 0.7.0

def local(key)
  if respond_to?(key)
    __send__(key)
  else
    locals.fetch(key) { NullLocal.new(key) }
  end
end

#localsHash

The current locals.

Returns:

  • (Hash)

    the current locals

Since:

  • 0.1.0

def locals
  (@locals || @scope.locals).dup
end

#render(options) ⇒ String

Render a partial or a template within a layout template.

Examples:

Rendering partial

# Given a partial under:
#   templates/shared/_sidebar.html.erb
#
# In the layout template:
#   templates/application.html.erb
#
# Use like this:
<%= render partial: 'shared/sidebar' %>

Rendering template

# Given a template under:
#   templates/articles/index.html.erb
#
# In the layout template:
#   templates/application.html.erb
#
# Use like this:
<%= render template: 'articles/index' %>

Rendering partial, using optional :locals

# Given a partial under:
#   templates/shared/_sidebar.html.erb
#
# In the layout template:
#   templates/application.html.erb
#
# Use like this:
<%= render partial: 'shared/sidebar', { user: current_user } %>

#
# `user` will be available in the scope of the sidebar rendering

Parameters:

  • options (Hash)

Options Hash (options):

  • :partial (String)

    the partial template to render

  • :template (String)

    the template to render

Returns:

  • (String)

    the output of the rendering process

Raises:

  • (Hanami::Error::UnknownRenderTypeError)

    if the given type to be rendered is unknown

Since:

  • 0.1.0

def render(options)
  renderer(options).render
end

#viewHanami::View

The current view.

Returns:

Since:

  • 0.1.0

def view
  @view || @scope.view
end