【问题标题】:getJson Unknown key but it is being sentgetJson 未知密钥,但正在发送
【发布时间】:2012-12-07 15:35:32
【问题描述】:

好的,这是另一个令人沮丧的练习。我终其一生都无法弄清楚出了什么问题。

控制器:

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

咖啡脚本:

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(data) 正在记录学生数据而不是主题。这我觉得非常令人费解。另外,为什么控制器看不到明显正在发送的关键“等级”?此外,是否有另一种方法(更好地阅读)来测试参数哈希中是否存在密钥?简而言之,这里有什么问题才能真正起作用?

TIA

【问题讨论】:

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


    【解决方案1】:

    你的部分问题就在这里:

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

    当您说obj.to_json 时,您会返回一个字符串,一个包含obj 的JSON 表示形式的字符串,但仍然是一个字符串。因此,当询问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 是否有密钥,替代方案有问题。

    【讨论】:

    • 开始 GET "/map.json?grade=11" for 127.0.0.1 at 2012-12-20 12:01:50 -0700 MapController#index 作为 JSON 参数处理:{"grade" =>“11”}在 193 毫秒内完成 500 内部服务器错误 ArgumentError(未知键:等级):app/controllers/map_controller.rb:6:in `index'
    • 由于某种奇怪的原因,我无法在该评论中添加另一行。但以上是终端日志的直接复制和粘贴。等级在那里,但我不知道发生了什么阻止它看到它。
    • 可能更容易将其添加到问题中,cmets 不能很好地处理这些事情。
    • ArgumentError 听起来像 Student 没有:grade
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-09-23
    • 1970-01-01
    • 1970-01-01
    • 2017-09-01
    • 2020-10-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多