在 Rails 4 中正确实现 Parsley.js 自定义远程验证器

Posted

技术标签:

【中文标题】在 Rails 4 中正确实现 Parsley.js 自定义远程验证器【英文标题】:Properly implementing the Parsley.js Custom Remote Validator in Rails 4 【发布时间】:2016-01-31 16:37:51 【问题描述】:

我正在尝试获取 data-parsley 以验证用户名是否已存在于数据库中。

我遇到的第一个问题是如何将 JSON 数据设置为在用户键入时动态包含“值”。我应该使用 jQuery 来实现吗?

_system_account.erb

<%=
    text_field_tag("access[username]",
                   value = nil,
                   options = :"data-parsley-remote" => "" ,
                              :"data-parsley-remote-options" => " 'type': 'POST', 'dataType': 'json', 'data':  ':username': 'value' ",
                              :"data-parsley-remote-validator" => "validate-username",
                              id:"username", placeholder:  t('access.simple_username'),
                              required: "required", pattern: "[a-z0-9_-]3,64$",
                              :"data-parsley-trigger" => "keyup",
                              :"data-parsley-minlength"=>"3" ,
                              :"data-parsley-maxlength"=>"64")
%>

表单发生变化时相关的javascript触发:

<script type="text/javascript">
    $('#username').bind('input propertychange', function()
    
        window.Parsley.addAsyncValidator('validate-username', function (xhr) 
            // console.log(this.$element);
            // jQuery Object[ input[name="q"] ]
            var response = $.parseJSON(xhr.responseText);
            alert( JSON.stringify(response) );

            // Second Problem: How do I make data-parsley identify it is an error and mark the field red or something

        , '/application/check_username_exists');
    ); </script>

application_controller.erb

这只是检查用户名是否存在。

  def check_username_exists
    username_exists = Access.exists?(username: params[:username])
    respond_to do |format|
      format.json  render json: :"exists" => username_exists.to_json 
      format.html
    end
  end

【问题讨论】:

【参考方案1】:

数据由欧芹填充,因此删除data: ':username': 'value'

既然你在用户端有控制权,最简单的就是使用响应状态:

status = Access.exists?(username: params[:username]) ?  :unauthorized : :ok
render nothing: true, status: status

无效状态(如未授权 = 401)用于无效字段,...

【讨论】:

从控制器获取输出:“在 2ms 内完成 200 OK (Views: 1.0ms | ActiveRecord: 0.0ms)”但无法从 javascript 获取输出;我怎么能提醒();状态码是什么? 您可以查看“网络”选项卡(在 Chrome 的开发工具中),您将获得响应标头。祝你好运 忘记使用双参数“ params[:access][:username]”

以上是关于在 Rails 4 中正确实现 Parsley.js 自定义远程验证器的主要内容,如果未能解决你的问题,请参考以下文章

如何在c#中正确实现等待异步[重复]

如何在python的类中正确实现辅助函数

在这种情况下,如何在 Flutter 中正确实现 FutureBuilder?

在 Android 中正确实现 ViewPager2

在PHP中正确实现模型类

如何在php中正确实现结构化菜单