【问题标题】:Rails - Improve handling json response with ajaxRails - 使用 ajax 改进处理 json 响应
【发布时间】:2016-04-13 19:05:43
【问题描述】:

我有一个用于页面预览的同步脚本。 preview 函数只是将数据发送到服务器,hookPreview 在单击时触发它,它应该在成功时附加响应数据。

window.Wiki = 
    preview: (raw_data) ->
        preview_path = "/wiki/preview"

        $.post preview_path,
            "raw_data": raw_data,
            (data) ->
                $("#preview").html data.raw_data
            "json"

    hookPreview: (tab, textarea) ->
        # Send data to controller on click
        $(tab).bind "click", ->
            res = Wiki.preview $(textarea).val()
            console.log(res)
            true

$(document).ready ->
    Wiki.hookPreview($("#preview-tab"), $(".editor"))

我可以在控制台中检查响应resObject {readyState: 1} 带有回调函数,但我无法调用res.status(在我的控制台中为 200)给我“未定义”。

首先,如何解析响应?其次,我想将我的脚本改进为异步风格(如mentioned here)。

编辑

在控制器中:

def preview
  # ...
  respond_to do |format|
    format.json
  end
end

使用preview.json.erb:

<%= {:body => @preview }.to_json.html_safe %>

终端中的记录器显示服务器已完成并显示“200 OK”,因此问题出在脚本上,而不是在服务器端。

【问题讨论】:

  • 使用JSON.parse方法
  • @uzaif data = $.parseJSON(res) 抛出意外的令牌错误。
  • 你有任何控制台错误吗?
  • 没有错误,除了我无法获取响应对象的属性。
  • 你检查了控制器中的 res 值吗?

标签: javascript jquery ruby-on-rails


【解决方案1】:

jQuery.post 像所有的 ajax 方法一样返回一个 promise 对象——而不是实际的响应。

Promise 对象就像一个令牌,在某个时间点将包含响应。

要检查响应,您需要向 Promise 添加 .done 回调:

window.Wiki = 
    preview: (raw_data) ->
        preview_path = "/wiki/preview"

        $.post preview_path,
            "raw_data": raw_data,
            (data) ->
                $("#preview").html data.raw_data
            "json"

    hookPreview: (tab, textarea) ->
        # Send data to controller on click
        # jQuery.bind is depreciated - use .on instead
        $(tab).on "click", ->
            promise = Wiki.preview( $(textarea).val() )
            promise.done (data) ->
              console.log(data) 
            true

$(document).ready ->
    Wiki.hookPreview($("#preview-tab"), $(".editor"))

【讨论】:

    最近更新 更多