module RenderSync::ViewHelpers

Public Instance Methods

sync(options = {}) click to toggle source

Surround partial render in script tags, watching for sync_update and sync_destroy channels from pubsub server

options - The Hash of options

partial - The String partial filename without leading underscore
resource - The ActiveModel resource
collection - The Array of ActiveModel resources to use in place of
             single resource

Examples

<%= sync partial: 'todo', resource: todo %>
<%= sync partial: 'todo', collection: todos %>
# File lib/render_sync/view_helpers.rb, line 18
def sync(options = {})
  collection   = options[:collection] || [options.fetch(:resource)]
  scope        = options[:channel] || options[:scope] || (collection.is_a?(RenderSync::Scope) ? collection : nil)
  partial_name = options.fetch(:partial, scope)
  refetch      = options.fetch(:refetch, false)

  results = []
  collection.each do |resource|
    if refetch
      partial = RefetchPartial.new(partial_name, resource, scope, self)
    else
      partial = Partial.new(partial_name, resource, scope, self)
    end
    results << "
      <script type='text/javascript' data-sync-id='#{partial.selector_start}'>
        RenderSync.onReady(function(){
          var partial = new RenderSync.Partial({
            name:           '#{partial.name}',
            resourceName:   '#{partial.resource.name}',
            resourceId:     '#{resource.id}',
            authToken:      '#{partial.refetch_auth_token}',
            channelUpdate:  '#{partial.channel_for_action(:update)}',
            channelDestroy: '#{partial.channel_for_action(:destroy)}',
            selectorStart:  '#{partial.selector_start}',
            selectorEnd:    '#{partial.selector_end}',
            refetch:        #{refetch}
          });
          partial.subscribe();
        });
      </script>
    ".squish.html_safe
    results << partial.render
    results << "
      <script type='text/javascript' data-sync-id='#{partial.selector_end}'>
      </script>
    ".squish.html_safe
  end

  safe_join(results)
end
sync_new(options = {}) click to toggle source

Setup listener for new resource from sync_new channel, appending partial in place

options - The Hash of options

partial - The String partial filename without leading underscore
resource - The ActiveModel resource
scope - The ActiveModel resource to scope the new channel publishes to.
        Used for restricting new resource publishes to 'owner' models.
        ie, current_user, project, group, etc. When excluded, listens
        for global resource creates.

direction - The String/Symbol direction to insert rendered partials.
            One of :append, :prepend. Defaults to :append

Examples

<%= sync_new partial: 'todo', resource: Todo.new, scope: @project %>
<%= sync_new partial: 'todo', resource: Todo.new, scope: @project, direction: :prepend %>
# File lib/render_sync/view_helpers.rb, line 77
def sync_new(options = {})
  partial_name = options.fetch(:partial)
  scope        = options[:scope]
  direction    = options.fetch :direction, 'append'
  refetch      = options.fetch(:refetch, false)
  resource     = scope.is_a?(RenderSync::Scope) ? scope.new : options.fetch(:resource)

  if refetch
    creator = RefetchPartialCreator.new(partial_name, resource, scope, self)
  else
    creator = PartialCreator.new(partial_name, resource, scope, self)
  end
  "
    <script type='text/javascript' data-sync-id='#{creator.selector}'>
      RenderSync.onReady(function(){
        var creator = new RenderSync.PartialCreator({
          name:         '#{partial_name}',
          resourceName: '#{creator.resource.name}',
          channel:      '#{creator.channel}',
          selector:     '#{creator.selector}',
          direction:    '#{direction}',
          refetch:      #{refetch}
        });
        creator.subscribe();
      });
    </script>
  ".html_safe
end