代码之家  ›  专栏  ›  技术社区  ›  Rich Apodaca

在执行AJAX服务器端验证时保持RESTful?

  •  1
  • Rich Apodaca  · 技术社区  · 14 年前

    我的Rails应用程序有许多表单。当Joe使用我的应用程序时,我希望每个表单都能为他提供关于每个字段输入有效性的即时视觉反馈。一个字段检查他的电子邮件地址格式-非常简单。但另一种方法允许他将当前资源与许多其他资源相关联,并应用复杂的业务规则。如果表单不完整或无效,我希望通过禁用“提交”按钮来阻止Joe继续前进。

    我可以通过在浏览器中编写JavaScript来复制Rails代码中出现的验证。但这很难闻——任何时候业务规则发生变化,我都需要在两个地方用两种不同的语言和两组测试来更新它们。

    或者我可以为资源的控制器添加一个名为“validate”的方法。它将接受AJAX请求中的表单数据,并返回一个响应,然后可以在Joe的表单中使用该响应来提供实时验证反馈。与“创建”操作不同,“验证”操作不会更改服务器的状态。“validate”的唯一目的是提供验证响应。

    进退两难的是,我不喜欢在Rails中向RESTful控制器添加操作。但我更不喜欢在两个不同的上下文中复制验证代码的想法。

    this SO question ,其中涉及到这个问题。但我对插件或技术不感兴趣。我也不认为这个问题一定是Rails特有的。我更感兴趣的是如何在Web应用程序中最好地处理这类问题。

    我也注意到了 this SO question ,这不包括维护RESTful架构的约束。

    3 回复  |  直到 7 年前
        1
  •  2
  •   Darrel Miller    14 年前

    我认为创建一个可以接受实体并确保它通过所有验证规则的验证器“processing resource”没有问题。

    您可以使用全局验证器来执行此操作

    POST /validator
    

    验证器必须识别传递的表示并执行适当的规则,或者您可以创建子资源,

    POST/foo/validator
    

    只要这些url是通过超媒体发现的,并且要验证的完整表示作为请求体传递,我看不到REST约束被违反。

        2
  •  1
  •   marc_s dmck    9 年前

    我希望我能正确理解,但是您可以将javascript请求发送到相同的create操作。例如:

    def create
    
      @data = DataObject.new(params[:data])
    
     if request.xhr?
        response = @data.valid? ? { :success =>  true } : { :errors => @data.errors }
        render :json => response
        return
      end
    
      # @data.save etc..
    
    end
    

        3
  •  0
  •   manuel aldana    14 年前

    不在客户端(javascript)和服务器端复制验证逻辑是正确的)。但是,添加验证资源也会增加维护工作量并增加服务器网络调用的成本。我喜欢在客户端进行基本的验证(更好的用户体验)以及服务器端的数据一致性。

    为什么不使用验证元数据附加模型,然后生成用于验证的forms+javascript呢。在最终提交时,您还将根据模型在服务器端进行最终验证。

    我确信Ruby可以使用一些通用的验证逻辑。我想一些现有的验证框架也可以重用。