1

我完全被这个困住了,几个小时的搜索还没有出现结果。当我尝试执行 ajax 请求时出现 406 错误。这是我的代码..

层控制器

    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

4

2 回答 2

3

如此变化

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

 render :json => series.tiers

解决问题,但我仍然不确定为什么:(如果有人知道为什么您的输入将不胜感激。

于 2013-01-21T03:53:33.503 回答
1

我不能告诉你为什么解决了这个问题,但我认为更好的解决方案可能是使用.getJSONcall 而不是.get.

当 Rails 在标头中找不到请求类型的正确响应类型时,会生成 406 Accept。当我使用Fiddler2从 a 窥探请求时.get,我看到了请求标头:

Accept: */*

这不会为 Rails 提供任何可使用的信息。如果请求的 URL 上有扩展名,例如.js在 javascript 的情况下,它也可以从中直觉,但这不适用于您的 JSON 请求。

当我.getJSON拨打电话时,我会看到请求标头:

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

这可能足以让 Rails 将请求的类型与您的 json 处理程序匹配。

于 2013-01-21T04:11:09.893 回答