【问题标题】:Access JSON data using jquery使用 jquery 访问 JSON 数据
【发布时间】:2016-06-03 14:28:07
【问题描述】:

我正在尝试使用 ajax 验证表单中电子邮件地址的唯一性,但我不知道如何使用 jquery 访问 JSON 数据。

到目前为止,当用户输入电子邮件地址时(当前在 keyup 上),输入将被发送到控制器并返回 JSON 数据,其中包含变量 {"email_exists":true}{"email_exists":false},具体取决于电子邮件地址是否以前是否保存到数据库。这可以正常工作。

我正在使用 jquery 来验证表单提交时的其他表单功能(电子邮件验证、字段存在),并根据问题动态显示错误。

我的问题是我不知道如何使用 jquery 访问返回的 JSON 数据。我也在努力使用 erb 访问它,<%= p params[:email_exists] %> 什么也没显示。我是 JSON 新手,如有任何帮助,将不胜感激,谢谢。

编辑:这就是我验证电子邮件地址的方式。

new.html.erb

$("#comingsoon_email").on('change keyup paste',function(){
        console.log("change?");
    $.post('/checkemail?email='+$("#comingsoon_email").val(),function(data){

routes.rb

post '/checkemail', to: 'comingsoons#emailcheck'

comingsoons_controller.rb

def emailcheck
  @comingsoon = Comingsoon.search(params[:email])
  respond_to do |format|
    format.json {render :json => {email_exists: @comingsoon.present?}}
  end
end

即将到来的.rb

def self.search(email)
        if email
            where('email = ?',email).first
        end

    end

JSON 返回

{"email_exists":true}{"email_exists":false} 取决于电子邮件地址之前是否已保存到数据库中。

如果电子邮件地址已被占用,我想通过 jquery 显示错误消息。

【问题讨论】:

  • 如果你通过 Ajax 进行验证,那么你应该在你的回调函数中做一些事情(或者 promise/future/etc,如果这是你所采取的路线)。
  • 我不确定我是否关注你。生病将我当前的代码添加到我的问题中,也许它会解决问题。
  • 你调用服务器。该调用(可能使用$.ajax$.post 或其他)具有成功和失败回调。在这些回调中,您可以访问数据。你可能想退后一步,在 JS 调试器中设置一个断点,看看这些回调的参数是什么。

标签: jquery ruby-on-rails json ajax


【解决方案1】:

在您传递给$.post 的函数中,您有data。那是JSON。

data.email_exists 是那个 JSON 数据的值,大致如下:

$.post('/checkemail?email='+$("#comingsoon_email").val(), function(data) {
  console.log(data.email_exists);
});

模糊相关,您可能想要:

  1. 清除电子邮件字段值
  2. 在函数调用之外创建 URL 以使其更易于阅读
  3. 您可以使用 $(this).val() 而不是重新引用元素,尽管这纯粹是为了可读性,而不是功能
  4. 让回调是一个外部函数,而不是一个内联的匿名函数——同样是为了可读性和可测试性

所以它最终看起来更像:

function processEmailValidation(data) {
  var emailExists = data.email_exists;
  console.log(emailExists);
  // Do actual stuff
}

keyup/change/paste 处理程序看起来更像:

var url = '/checkemail?email=' + $(this).val();
$.post(url, processEmailValidation);

你也应该优雅地处理 Ajax 失败,我没有在这里反映。

我个人也会提取 keyup/change/paste 处理程序,并将特定于 DOM 的代码从处理程序代码中分离出来,再次是为了可测试性。但这是一个单独的问题。

【讨论】:

  • 很好的答案,谢谢。日志正在打印数据,现在我必须尝试使用​​它来“做实际的事情”。 Jquery 不是我的强项,所以我要试一试,看看是否可以弹出我的错误消息。我使用的原始 jquery 是为我的应用程序复制和编辑的,我将尝试做出您建议的一些更改。
  • 好的排序。 if(emailExists == true) { SHOW ERROR MESSAGE } 仅当电子邮件已保存在数据库中时才成功显示消息。另一方面,我不知道如何优雅地处理 ajax 失败。
  • @RobHughes $.post 的 jQuery 文档提出了多种方法;最简单的是使用$.post(url).done(functionRef).fail(functionRef)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-02
  • 2016-10-26
  • 1970-01-01
  • 1970-01-01
  • 2017-05-10
  • 1970-01-01
相关资源
最近更新 更多