未捕获的SyntaxError:意外的令牌u

时间:2014-03-12 23:05:29

标签: javascript jquery ruby-on-rails ajax json

我正在尝试从get请求获取JSON响应。但是,我收到以下错误:Uncaught SyntaxError: Unexpected token u。我知道rails路由有效,因为我确实在控制台中成功加载了响应。

当复选框改变并被选中时,Ajax响应应该开始。

为什么我从$.parseJSON收到此错误?

Rails控制器

def providers
   @providers = User.order("last_name ASC, first_name ASC, middle_name ASC").where("provider_flag = ? and inactive_flag = ? and del_flag = ?", true, false, false).select("id, CONCAT(IFNULL(last_name,''), ', ', IFNULL(first_name,''), IFNULL(middle_name,'')) AS full_name");

    respond_to do |format|
        format.json { render :json => { :providers =>  @providers.to_json}, :status => :ok }
        # format.json { render :json => @providers.to_json }
    end
end

的Javascript

$('#provider_chk').change(function() {
        if($(this).is(":checked")) {
            $.ajax({
                url: '<%= providers_schedule_index_path %>',
                type: 'GET',
                dataType: 'json',
                data: {
                    authenticity_token: $('meta[name=csrf-token]').attr('content')
                },
                success: function(data) {
                    console.log('loaded successfully.');
                    var providers = $.parseJSON(data.responseText)['providers'];
                    providers_count = $(providers).size();
                    console.log(providers);
                    console.log(providers_count);
                },
                error: function(data) {
                    console.log("An error has occurred!")    
                }
            });
        } else {
            $('#providers_results').empty();
        }
    });

JSON响应

providers: "[{"id":2,"full_name":"Test, User"}]"

3 个答案:

答案 0 :(得分:0)

您的JSON响应看起来应该更像:

providers: [{"id":2,"full_name":"Test, User"}]

不需要最外面的引号。

如果你真的需要外部引号,你需要逃避内部引号。

答案 1 :(得分:0)

在$ .ajax({})中,添加属性“async:false”。 parseJSON还没有获得JSON - 它会立即尝试对undefined(“u”)进行操作并抛出错误。

答案 2 :(得分:0)

删除to_json,因为您已经告诉rails返回json

format.json { render :json => { :providers => @providers }, :status => :ok }