class RailsEmailPreview::ViewHooks

Add hooks before, after, or replacing a UI element

Constants

POSITIONS
SCHEMA

All valid hooks and their argument names

Public Class Methods

new() click to toggle source
# File lib/rails_email_preview/view_hooks.rb, line 24
def initialize
  @hooks = Hooks.new
end

Public Instance Methods

add(id, pos, &block) click to toggle source

@param [Symbol] id @param [:before, :replace, :after] pos @example

view_hooks.add :headers_content, :after do |mail:, preview:|
  raw "<b>ID</b>: #{h mail.header['X-APP-EMAIL-ID']}"
end
# 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) click to toggle source

@param [Symbol] id @param [:before, :replace, :after] pos @example

view_hooks.add_render :list, :before, partial: 'shared/hello'
# 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) click to toggle source
# 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

Private Instance Methods

render_providers(providers, locals, template) click to toggle source
# File lib/rails_email_preview/view_hooks.rb, line 68
def render_providers(providers, locals, template)
  template.safe_join providers.map { |provider| template.instance_exec(locals, &provider) }, ''
end
validate_locals!(hook_id, locals) click to toggle source
# File lib/rails_email_preview/view_hooks.rb, line 72
def validate_locals!(hook_id, locals)
  if locals.keys.sort != SCHEMA[hook_id].sort
    raise ArgumentError.new("Invalid arguments #{locals.keys}. Valid: #{SCHEMA[hook_id]}")
  end
end