【问题标题】:Refactoring coffee script method重构咖啡脚本方法
【发布时间】:2013-11-02 13:30:36
【问题描述】:

我已经把这个方法放在一起,以在 Rails 应用程序中实现一些基本的验证。

我对 rails/coffeescript 非常陌生,想知道是否有人对重构/简化它有想法:

  validateBillingAddress: (event) ->
    add1 = $('#user_billing_address_1')
    city = $('#user_billing_city')
    zip = $('#user_billing_zip')

    add1.removeClass('error')
    city.removeClass('error')
    zip.removeClass('error')

    if !$('#user_billing_agreement').is(':checked')
      $('button[type=submit]').removeAttr('disabled')
      alert('You must agree to the subscription')
      return

    if !add1.val().length
      $('button[type=submit]').removeAttr('disabled')
      add1.addClass('error')
      return

    else if !city.val().length
      $('button[type=submit]').removeAttr('disabled')
      city.addClass('error')
      return

    else if !zip.val().length
      $('button[type=submit]').removeAttr('disabled')
      zip.addClass('error')
      return
    else 
      @processCard()

    event.preventDefault()

【问题讨论】:

    标签: ruby-on-rails coffeescript


    【解决方案1】:

    我认为你可以尝试这样的事情(未测试)

    validateBillingAddress: (event) ->
      event.preventDefault()
      fields = $('#user_billing_address_1, #user_billing_city, #user_billing_zip')
    
      fields.removeClass('error')
    
      unless $('#user_billing_agreement').is(':checked')
        $('button[type=submit]').removeAttr('disabled')
        alert('You must agree to the subscription')
        return
    
      fields.each ->
        if !$(this).val().length
          $('button[type=submit]').removeAttr('disabled')
          $(this).addClass('error')
    
      if fields.filter('.error').length > 0
        return
      else
        @processCard()
    

    【讨论】:

    • 做得很好,开箱即用。 unless 是一个很棒的功能。 filter 也是 jquery 或 coffeescript 函数吗?
    • 另外,如果您只需要检查字段是否为空,您可以使用 HTML5 验证。 the-art-of-web.com/html/html5-form-validation
    【解决方案2】:

    这是我的看法。

    非常小的、单一关注的功能。这可能有点过头了,但我发现大多数应用程序的复杂性都会增加,尽早获得一个干净的结构对以后会有帮助。

    它还为以后在其他表单上重用此代码奠定了基础。甚至可能制作一个咖啡脚本类。

    #
    # Handle submit event, validate, and submit
    #
    $('form').on "submit", ->
      if isValidBillingAddress() and isAgreementChecked()
        @processCard()
    
    #
    # Validation checks
    #
    isAgreementChecked = ->
      if $('#user_billing_agreement').is(':checked')
        true
      else
        alert('You must agree to the subscription')
        false
    
    isValidBillingAddress = ->
      enableForm()
      for field in requiredFormFields()
        do (field) ->
          if isInvalidData(field)
            showErrorOnField(field)
          else
            field.removeClass('error')
    
    #
    # Support functions
    #
    requiredFormFields = ->
      address1 = $("#user_billing_address_1")
      city = $("#user_billing_city")
      zip = $("#user_billing_zip")
      [address1, city, zip]
    
    isInvalidData = (field) ->
      field.val() is ""
    
    showErrorOnField = (field) ->
      field.addClass('error')
    
    enableForm = ->
      $('button[type=submit]').removeAttr('disabled')
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-03
      • 1970-01-01
      • 2012-07-16
      • 1970-01-01
      • 1970-01-01
      • 2013-01-09
      相关资源
      最近更新 更多