Class: RailsEmailPreview::ViewHooks

Inherits:
Object
  • Object
show all
Defined in:
lib/rails_email_preview/view_hooks.rb

Overview

Add hooks before, after, or replacing a UI element

Defined Under Namespace

Classes: Hooks

Constant Summary collapse

SCHEMA =

All valid hooks and their argument names

{
    list:            args[:index],
    breadcrumb:      args[:show],
    breadcrumb_content: args[:show],
    headers_and_nav: args[:show],
    headers:         args[:show],
    headers_content: args[:show],
    nav:             args[:show],
    nav_i18n:        args[:show],
    nav_format:      args[:show],
    nav_send:        args[:show],
    email_body:      args[:show],
}
POSITIONS =
[:before, :replace, :after].freeze

Instance Method Summary collapse

Constructor Details

#initializeViewHooks

Returns a new instance of ViewHooks.



24
25
26
# File 'lib/rails_email_preview/view_hooks.rb', line 24

def initialize
  @hooks = Hooks.new
end

Instance Method Details

#add(id, pos, &block) ⇒ Object

Examples:

view_hooks.add :headers_content, :after do |mail:, preview:|
  raw "<b>ID</b>: #{h mail.header['X-APP-EMAIL-ID']}"
end

Parameters:

  • id (Symbol)
  • pos (:before, :replace, :after)


47
48
49
# File 'lib/rails_email_preview/view_hooks.rb', line 47

def add(id, pos, &block)
  @hooks[id][pos] << block
end

#add_render(id, pos, *render_args) ⇒ Object

Examples:

view_hooks.add_render :list, :before, partial: 'shared/hello'

Parameters:

  • id (Symbol)
  • pos (:before, :replace, :after)


32
33
34
35
36
37
38
39
# File 'lib/rails_email_preview/view_hooks.rb', line 32

def add_render(id, pos, *render_args)
  render_args = render_args.dup
  render_opts = render_args.extract_options!.dup
  add id, pos do |locals = {}|
    render *render_args, render_opts.merge(
        locals: (render_opts[:locals] || {}).merge(locals))
  end
end

#render(hook_id, locals, template, &content) ⇒ Object



51
52
53
54
55
56
57
58
59
60
61
62
63
64
# File 'lib/rails_email_preview/view_hooks.rb', line 51

def render(hook_id, locals, template, &content)
  at = @hooks[hook_id]
  validate_locals! hook_id, locals
  parts = [
      render_providers(at[:before], locals, template),
      if at[:replace].present?
        render_providers(at[:replace], locals, template)
      else
        template.capture { content.call(locals) }
      end,
      render_providers(at[:after], locals, template)
  ]
  template.safe_join(parts, '')
end