向Spree前端添加自定义的客户端表单验证

时间:2016-11-24 17:48:06

标签: jquery ruby-on-rails forms jquery-validate spree

我正在尝试向Spree的checkout/address页面中的输入字段添加自定义客户端验证。 所以,这是我到目前为止所做的:

  1. 将输入添加到表单(此处使用Haml& SimpleForm):

    = form.input :vat_number, label: Spree.t(:vat_number)
    
  2. 在我的vendor/assets/javascripts/spree/frontend/checkout/address.js.coffee内,添加jQuery验证方法并将规则插入validate()调用:

    ($).validator.addMethod "vatNumber", (value, element) -> 
      return false
    , "Something wrong!"
    
    Spree.onAddress = () ->
      if ($ '#checkout_form_address').is('*')
    
      ($ '#checkout_form_address').validate({
        rules: {
          order_bill_address_attributes_vat_number: {
            vatNumber: true
          }
        }
      })
    
      # ... rest of the file ...
    
  3. 验证器似乎不在vat_number字段上运行,尽管剩余的表单验证有效。在javascript调试控制台中,如果我输入$.validator.methods,我确实看到添加了新的vatNumber方法,因此问题必须与我调用validate()的方式相同,或者与我使用SimpleForm的事实有关。

    我已将validate()调用的代码更改为:

    ($ '#order_bill_address_attributes_vat_number').rules("add", {vatNumber: true})
    ($ '#checkout_form_address').validate()
    

    我在javascript控制台窗口中收到以下错误:

    TypeError: undefined is not an object (evaluating '$.data(element.form,"validator").settings')
    

    有没有人试图这样做?

1 个答案:

答案 0 :(得分:0)

我弄清楚问题是什么。

显然,在vatNumber文件底部Spree.onAddress调用后添加了address.js.coffee方法。

我将addMethod调用移到了另一个地方(我知道它在address.js.coffee中的代码之前被调用/运行,它突然起作用了。

现在,我想知道这是不是CoffeeScript。代码转换为Javascript后,代码的顺序是否会发生变化?