json 请求 return html rails

json request return html in rails

我目前正在尝试制作一个 Ajax 脚本来与我本地主机上的 Rails 服务器通信(目前)。问题是我在我的 $.ajax 请求中指定我想要 'json' 中的格式,但是 rails returns 一个 'html' 格式:

$(document).ready(function(){

$('form').on("submit",function(){
    $.ajax({
        contentType: 'application/json; charset=utf-8',
        url : "http://192.168.0.36:3000/?value=10",
        type : "GET",
        dataType : 'JSON',
        success: function(data){
            alert(JSONParsedata(data));
        },
        error: function(XMLHttpRequest, textStatus, errorThrown)
        {
            alert(textStatus +", " +errorThrown);
        }
    });


    return false;
})

在 rails 服务器的控制台日志中,我可以读到:

WelcomeControllerindex 处理为 HTML ... 在 34 毫秒内完成 200 OK...

我实际上收到了来自服务器的响应,但是格式是 HTML 而不是 JSON。

我准确地说,我的 rails 控制器的 welcomeController 代码包含:

 respond_to do |format|
  format.html
  format.json { render :json => @z }
end

z 是我想发回 Ajax 请求的变量,并且在之前定义(我点亮了代码以使其易于理解)

因此,Jquery 试图以 JSON 格式解析结果,然后以以下方式结束: parsererror syntaxerror 意外标记 '<' 对应整页的第一个字符!

我搜索了几个小时,但我不知道如何解决这个问题。

非常感谢您的帮助

尝试更改 { render :json => @z } 以呈现 json: { data: @z }

也将"JSON"改为"json"

其实我今天早上解决了这个问题:

此方法适用于 Chrome 等基本浏览器,但不适用于 "Rhomobile" 我正在使用的应用程序 IDE(即使使用相同的 Ajax 请求!)。为了解决这个问题,我向请求添加了一个参数 "format" 和一个值 "json" (&format=json) 并且我向我的控制器添加了一个条件:如果变量 'format' exists && format == 'json' 然后将结果渲染到 JSON。否则它会在 HTML 中呈现。这适用于 Rhomobile 和浏览器。

我不确定为什么这适用于基本浏览器而不适用于 Rhomobile,但我认为这是由于 'Cross-domain' 请求。 (我使用 'rack-cors' 服务器端)。 现在它适用于两者。

感谢大家的帮助。

添加header

'Accept: application/json'

您可以将 "json" 后缀添加到您的 api 点赞调用 http://host:port/api.json

另外两件事要尝试:

  1. 尝试将 .json 添加到 url 的末尾。例如,如果您请求 url http://server.org/foo you would instead make the request to http://server.org/foo.json (or from http://server.org/.json if the url was http://server.org/).

这与您正在使用的想法基本相同,但它融入了 rails。

  1. 在您的路线中加入默认格式,例如
resources :users, only: [:update, :index, :destroy, :show, :create], path: '/admin/users', defaults: { format: :json }

这就是我遇到问题时解决的问题 尽管 设置了适当的接受 headers。