jquery .ajax 对 ruby​​ on rails 服务器的 post 请求在客户端出现 JSON.parse 错误

Posted

技术标签:

【中文标题】jquery .ajax 对 ruby​​ on rails 服务器的 post 请求在客户端出现 JSON.parse 错误【英文标题】:jquery .ajax post request to a ruby on rails server gives a JSON.parse error on the client 【发布时间】:2013-11-12 03:30:03 【问题描述】:

我在客户端有 jquery 代码,试图与 rails 服务器上的 ruby​​ 通信。我目前正在尝试通过客户端进行登录。

这是当用户单击提交按钮时执行的 jquery 代码。

$.ajax(
        headers:  'X-CSRF-Token': $('meta[name="csrf-token"]').attr('content') ,
        type:"POST",
        data: hash,
        url: 'http://0.0.0.0:3000/users/sign_in.json',
        success: function(data)  
            alert('Success');
            alert(JSON.stringify(data));
        ,
        error: function(data)  
            alert('Failed!');
            alert(JSON.stringify(data));
        ,
    );
);

我在rails服务器中监控日志,看到“Completed 200 OK in 387ms”,这意味着服务器进程运行良好,响应已经发送回客户端。

但是,在客户端而不是成功函数中,错误函数运行并且我得到"readyState":0,"responseText":"","status":0,"statusText":"error"

这是控制器中的代码

def create
resource = User.find_by_email(params[:user][:email])
return invalid_login_attempt unless resource

if resource.valid_password?(params[:user][:password])
  sign_in(:user, resource)
  resource.ensure_authentication_token
  respond_to do |format|
    format.html  redirect_to user_courses_path(current_user), notice: 'You are logged in' 
    format.json  render :json=>  :auth_token=> current_user.authentication_token, :success=> true, :status=> :created 
  end
  return
end
invalid_login_attempt

结束

我尝试使用 firebug 并在我看到的 POST 请求的响应选项卡中

syntaxerror json.parse 数据意外结束

这意味着从服务器发送的响应不是正确的哈希值。我尝试使用

执行相同的发布请求
curl -v -H "Accept: application/json" -H "Content-type: application/json" -X POST -d ' "user":"email":"asdf@jjpt.com","password":"password"'  http://0.0.0.0:3000/users/sign_in

我收到以下回复"auth_token":"zk1dyduMAo283mxP5o1m","success":true,"status":"created"

所以,curl 请求正在运行。但是,jquery 请求返回 JSON.parse 错误。我不知道为什么。谁能帮帮我,这有点令人沮丧。

【问题讨论】:

您是否尝试过使用console.log(data); 而不是alert(JSON.stringify(data));?它可以让您更深入地了解 JSON 对象会发生什么 嗨,我尝试了 console.log(data),它给了我与警报类似的信息 这是跨域请求吗? 我不确定是否是跨域请求。我正在从计算机中的 HTML 文件向 rails 本地服务器发出请求。我已经尝试过放置crossDomain:true,但还是不行。 你的 curl 是如何工作的?由于您没有在那里发送authenticity_token。另外,如果您使用浏览器,我强烈建议 getpostman.com 调试 http ajax 调用,因为它在调用期间共享相同的 cookie/会话。 【参考方案1】:

好的,所以如果没有您的控制器代码,很难理解问题的根源,但可能的解决方案:

在您的操作结束时输入如下内容:

respond_to do |format|
  format.json  render json: 'Your message', status: :ok  # Don't use here .to_json!
end

另外,您可以在客户端添加:dataType: 'json' 而且你不需要执行JSON.stringify(data),你可以使用data,因为它已经被正确格式化了。

这应该可以解决问题,如果没有,请为我们提供操作代码。

【讨论】:

嗨,我刚刚添加了我的控制器代码。我使用 render :json=> :auth_token=> current_user.authentication_token, :success=> true, :status=> :created 。另外,我尝试了数据类型:'json'。它似乎不起作用,因为请求处理后仍在调用错误函数【参考方案2】:

我认为这是因为您将 http 响应代码放在一个 json 字符串中,该字符串旨在供您的成功函数使用。由于 jquery 没有看到 http 响应代码,因此它假定错误并返回错误。

您应该在消息正文之外包含状态代码 - 如下所示:

render json: authtoken: 'xyz', myotherstuff: 'abc', status: :created

我遇到了同样的问题,这对我有用。

我发现这也很有帮助:http://www.codyfauser.com/2008/7/4/rails-http-status-code-to-symbol-mapping

它告诉我使用什么 :symbol 来对应哪个 http 状态码。

【讨论】:

以上是关于jquery .ajax 对 ruby​​ on rails 服务器的 post 请求在客户端出现 JSON.parse 错误的主要内容,如果未能解决你的问题,请参考以下文章

对链接进行 ajax 调用单击以更新链接本身(Ruby on Rails)

Ruby on Rails 6. 使用带有 Ajax 的 Bootstrap 4 工具提示

jquery绑定的事件对ajax刷新出的数据不生效,on可能受jquery版本影响

如何在 Ruby on Rails 中完成延迟作业后执行 ajax 回调?

使用 AJAX 请求下载文件数据 - ruby​​ on rails 3

Ruby on Rails AJAX文件上传