getJson未知密钥但正在发送

时间:2012-12-20 06:47:57

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

好的,这是另一种令人沮丧的运动。我不能为我的生活弄清楚什么是错的。

控制器:

class MapController < ApplicationController
layout "map"

  def index
    if params.has_key? :grade
      @students = Student.find(:grade => params[:grade])
      @subjects = Subject.where(:grade => @students.map(&:grade))
    else
      @students = Student.all
      @subjects = Subject.all
    end

    @json = @students.to_gmaps4rails do |student, marker|
      marker.infowindow render_to_string(:partial => "/map/infowindow", :locals => {:student => student})
                                          marker.title "#{student.name}"
                                          marker.json({:address => student.full_address, :grade => student.grade, :subjects => student.subjects})
    end
    respond_to do |format|
      format.html
      format.xml {render :xml => @subjects.to_xml}
      format.json {render :json => @subjects.to_json}
    end
    end
end

CoffeeScript的:

jQuery ->
  $(".mapDataGrade").append "<option value=-1>-</option>"
  $(".mapDataGrade").append "<option value=#{i}>#{i}</option>",
  i for i in [8..12]

  $(".mapDataSubject").append "<option value=-1>-</option>"

  grade = "grade": "#{$('.mapDataGrade').val()}", tagmode: "any", format: "json"

  $.getJSON "map.json",
    grade,
      (data)->
        console.log(data)
        $('.mapDataSubject').find('option').remove().end()
        $(".mapDataSubject").append "<option value=-1>-</option>"
        $.each data.items, (i,item) ->
          $(".mapDataSubject").append "<option value=#{i}>#{i}</option>"

现在第一部分工作得非常好,它的.getJson不是。在第一页加载时,它返回一个内部服务器错误(500),这是可以理解的,因为返回了id为-1,但这仍然不能解释为什么console.log(数据)正在记录学生数据而不是主题。我发现这非常令人费解。另外,为什么控制器看不到关键的等级&#34;哪个显然被发送?此外,还有另一种方法(更好地阅读)来测试params散列中是否存在密钥?简而言之,这里有什么不对,这实际上有用吗?

TIA

1 个答案:

答案 0 :(得分:0)

你的部分问题就在这里:

format.json {render :json => @subjects.to_json}

当你说obj.to_json时,你得到一个String back,一个包含JSON表示obj但仍然是String的字符串。因此,当被要求map.json时,服务器最终会这样做:

render :json => some_string_that_is_already_json

并且您最终会将双重编码数据发送回客户端。 $.getJSON调用期望一个JSON字符串 - 而不是JSON编码的JSON字符串 - 所以我不希望任何明智的事情发生。你的console.log(data)会向你显示一些看起来像JavaScript对象的东西,但看起来可能是骗人的:JSON字符串看起来很像控制台中的对象。

至于您的控制器未获得:grade的原因,请查看param中的内容,它应立即显示在您的日志中。

params.has_key? is the right way查看params是否有密钥,替代方案存在问题。