Module: Keynote::Inline

Defined in:
lib/keynote/inline.rb

Overview

The Inline mixin lets you write inline templates as comments inside the body of a presenter method. You can use any template language supported by Rails.

Basic usage

After extending the Keynote::Inline module in your presenter class, you can generate HTML by calling the erb method and immediately following it with a block of comments containing your template:

def link
  erb
  # <%= link_to user_url(current_user) do %>
  #   <%= image_tag("image1.jpg") %>
  #   <%= image_tag("image2.jpg") %>
  # <% end %>
end

Calling this method renders the ERB template, including passing the calls to link_to, user_url, current_user, and image_tag back to the presenter object (and then to the view).

Passing variables

There are a couple of different ways to pass local variables into an inline template. The easiest is to pass the binding object into the template method, giving access to all local variables:

def local_binding
  x = 1
  y = 2

  erb binding
  # <%= x + y %>
end

You can also pass a hash of variable names and values instead:

def local_binding
  erb x: 1, y: 2
  # <%= x + y %>
end

The inline method

If you want to use template languages other than ERB, you have to define methods for them by calling the #inline method on a presenter class:

class MyPresenter < Keynote::Presenter
  extend Keynote::Inline
  presents :user, :account
  inline :haml
end

This defines a #haml instance method on the MyPresenter class.

If you want to make inline templates available to all of your presenters, you can add an initializer like this to your application:

class Keynote::Presenter
  extend Keynote::Inline
  inline :haml, :slim
end

This will add #erb, #haml, and #slim instance methods to all of your presenters.

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.extended(base) ⇒ Object

Extending Keynote::Inline automatically creates an erb method on the base class.



104
105
106
# File 'lib/keynote/inline.rb', line 104

def self.extended(base)
  base.inline :erb
end

Instance Method Details

#inline(*formats) ⇒ Object

For each template format given as a parameter, add an instance method that can be called to render an inline template in that format. Any file extension supported by Rails is a valid parameter.

Examples:

class UserPresenter < Keynote::Presenter
  presents :user
  inline :haml

  def header
    full_name = "#{user.first_name} #{user.last_name}"

    haml binding
    # div#header
    #   h1= full_name
    #   h3= user.most_recent_status
  end
end


92
93
94
95
96
97
98
99
100
# File 'lib/keynote/inline.rb', line 92

def inline(*formats)
  require "action_view/context"

  Array(formats).each do |format|
    define_method format do |locals = {}|
      Renderer.new(self, locals, caller(1)[0], format).render
    end
  end
end