返回406的Rails对于ajax请求不可接受

时间:2013-01-21 03:30:00

标签: ajax jquery ruby-on-rails-3.2

我完全陷入了这个问题,几个小时的搜索没有结果。当我尝试执行ajax请求时,我收到406错误。这是我的代码..

Tiers控制器

    def index
      series = Series.find_by_id(params[:series_id])
      respond_to do |format|
        format.json { render :json => series.tiers }  
      end
    end

的Javascript

    $('#series_id').change ->
      series_id = $('#series_id').val()

    $.get '/admin/tiers', {series_id:series_id}, (result) ->
      element = $('select[name *= "tier_id"]')
      element.empty()
      $.each result, (index, item) ->
        element.append $('<option/>', value:item.id, text: item.title)

这是我从rails服务器获取的错误

      Started GET "/admin/tiers/1" for 127.0.0.1 at 2013-01-21 14:19:38 +1100
      Processing by Admin::TiersController#index as JSON
        Parameters: {"series_id"=>"1"}
        User Load (0.4ms)  SELECT "users".* FROM "users" WHERE "users"."id" = 1 LIMIT 1
          (0.1ms)  begin transaction
          (0.5ms)  UPDATE "users" SET "last_request_at" = '2013-01-21 14:19:38.827810', "perishable_token" = 'y0TMicsW2l4zgSiQcJx', "updated_at" = '2013-01-21 14:19:38.829452' WHERE "users"."id" = 1
          (2.5ms)  commit transaction
        Tier Load (0.3ms)  SELECT "tiers".* FROM "tiers" WHERE "tiers"."id" IS NULL LIMIT 1
        Tier Load (0.3ms)  SELECT "tiers".* FROM "tiers" 
        Series Load (0.2ms)  SELECT "series".* FROM "series" 
        Series Load (0.2ms)  SELECT "series".* FROM "series" WHERE "series"."id" = 1 LIMIT 1
      Completed 406 Not Acceptable in 30ms (ActiveRecord: 4.4ms)

真的不知道是什么东西,控制器看起来很好,看起来内容类型是json。

我也在使用rails 3.2.11

2 个答案:

答案 0 :(得分:3)

如此改变

  respond_to do |format|
    format.json { render :json => series.tiers }  
  end

 render :json => series.tiers

修复问题,但我仍然不确定原因:(如果有人知道为什么你的意见会受到高度赞赏。

答案 1 :(得分:1)

我无法告诉您解决问题的原因,但我认为更好的解决方案可能是使用.getJSON调用而不是.get

当Rails无法在Accept标头中找到所请求类型的正确响应类型时,会生成406。当我使用Fiddler2来窥探来自.get的请求时,我会看到请求标头:

Accept: */*

这不会给Rails提供任何信息。如果请求的URL上有扩展名,例如javascript中的.js,它也可以直接来自,但是这不适用于您的JSON请求。

当我进行.getJSON通话时,我会看到请求标头:

Accept: application/json, text/javascript, */*; q=0.01

这可能是Rails将请求的类型与json处理程序匹配的足够信息。