【问题标题】:How to properly pass a JSON in rails如何在 Rails 中正确传递 JSON
【发布时间】:2015-07-27 18:41:28
【问题描述】:

我也是 Web 开发和 Rails 的新手。我在 php 中创建了一个供内部使用的 web 应用程序,现在正在将其转换为 rails。试图找出 render 做了什么是困难的。例如,我发现这样的定义:

render(options = nil, extra_options = {}, &block) protected

Renders the content that will be returned to the browser as the response body. 

似乎没有人告诉作者你在其定义中没有使用一个词。

我试图理解渲染,因为根据How to pass json response back to client,这是比我尝试过的方法更好的完成任务的方法。但是没有其他的部分,我不知道如何实现它。

可能是由于我缺乏网络经验,所以如果有人有任何指向定义的链接,这可能会有所帮助,请发布它们。

我收到此错误:

GetData 中的错误:JSON.parse:JSON 数据第 2 行第 3 列的预期属性名称或“}”

当我在警告框中打印字符串时,它显示为一个长字符串,所以我不知道“第 2 行”在哪里。如果我将限制设置为 1,我会得到同样的错误,这确实使“第 2 行”很难找到。

这是我返回的数据示例:

[{"DocumentNbr":"SS9230","DocumentRevision":""},{"DocumentNbr":"SS8640","DocumentRevision":"17"},{"DocumentNbr":"SS8618","DocumentRevision":"4"},{"DocumentNbr":"SS8630","DocumentRevision":"20"},       

我不知道 " 是否应该拼写为 &quot 或者至少它在警报框中的显示方式。我不知道这是正常的还是导致 JSON.parse 的错误失败。除了alert还有其他方法可以检查数据吗?

我有一个 javascript 函数可以在视图中调用“GetData”:

var wholeNumberData;
wholeNumberData = GetData('wholeNumber', wholeNumber);

看起来像这样(精简版):

function GetData(getType, param) {

    var data;
    var params;

    params = 'wholeNumber=' + param;
    data = SendRequest('wholenumber/index', params);
    return data;
}

function SendRequest(source, params) {

var http = new XMLHttpRequest();

http.open("GET", source + '?' + params, false);
http.setRequestHeader("Content-type","application/json");
http.onload = function() {
        //alert('in function');
}
http.send(params);

alert(http.responseText);//Works
return JSON.parse(http.responseText);//FAILS

}

路由 Wholenumber/index 指向一个 index.html.erb 连接这个:

<% @list = Wholenumber.where("DocumentNbr LIKE ?", params[:wholeNumber] + "%").limit(10) %>
<%= @list.to_json(:only => [:DocumentNbr, :DocumentRevision]) %>

【问题讨论】:

    标签: javascript ruby-on-rails ruby json


    【解决方案1】:

    这是一种不寻常的方法,但您可以将 html_safe 添加到您的 to_json 方法中,它应该可以按照您的方式工作。

    <%= @list.to_json(:only => [:DocumentNbr, :DocumentRevision]).html_safe %>
    

    如果您希望控件呈现 JSON,而不是尝试从 html 解析 JSON,您可以让控制器操作执行以下操作:

    def action
      @list = Wholenumber.where("DocumentNbr LIKE ?", params[:wholeNumber] + "%").limit(10)
      render json: @list.to_json(:only => [:DocumentNbr, :DocumentRevision])
    end
    

    The Rails Guides 有更彻底的 Rails 渲染演练

    【讨论】:

    • 感谢您的链接,我以前开始阅读它,但这次我读了大约三分之二,因为您推荐了它。我仍然看不到它在我的情况下如何工作。如果我要使用数据创建一个组合框,渲染如何知道将它放在哪里?或者,如果我尝试您的方法,数据如何进入组合框?如果我这样做不当,我宁愿现在就改变我的方式。
    • render 方法只能根据请求返回一种类型的结果。如果你说render json,它只会渲染json。因此,在这种情况下,访问“localhost:3000/controller/action”之类的内容将只有 json,没有 html。然后,您可以使用 ajax 请求将该页面中的数据加载到不同页面上的组合框中。如果您希望 json 和 html 在同一页面上,则必须使用第一个选项,使用 html_safe。那么你就不需要ajax了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-06-22
    • 2014-05-26
    • 2021-07-12
    • 2019-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多