app/assets/javascripts/components/remoteForm.js.coffee

Summary

Maintainability
Test Coverage
App.components.remoteForm = ->
  initialize: ->
    @bindEvents()

  bindEvents: ->
    @on 'ajax:complete', @onAjaxComplete.bind(this)
    @on 'submit', @onSubmit.bind(this)

  onSubmit: ->
    App.mediator.publish 'remoteForm:beforeSubmit', @container

  onAjaxComplete: (el, response) ->
    @cleanErrors()
    callback = if parseInt(response.status, 10) is 200 then @onSuccess else @onError
    callback.bind(this)(el, JSON.parse(response.responseText))

  onSuccess: (el, response) ->
    if response.redirect
      window.location.href = response.redirect
    else
      App.mediator.publish 'remoteForm:success', {identifier: @identifier, response: response}

  onError: (el, response) ->
    err = response.errors || 'Error'
    if _.isObject err
      _.each err, (value, key) =>
        field = @container.find("[name*='[#{key}]']").closest('.field')
        field.addClass('field_with_errors')
        field.append("<div class='error'>#{value[0]}</div>")

    else
      submitContainer = @container.find('input[type=submit]').closest('p')
      submitContainer.before("<p class='error all'>#{ err }</p>")
    App.mediator.publish 'remoteForm:error', {identifier: @identifier, response: response}

  cleanErrors: ->
    @container.find('.error').remove()
    @container.find('.field_with_errors').removeClass('field_with_errors')