2012-12-20 16 views
1

好的,這是另一個沮喪的練習。我不能爲了我的生活找出什麼是錯的。getJson未知的密鑰,但它正在發送

控制器:

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),這是可以理解的,因爲返回的是-1,但仍然不能原諒console.log(data)記錄學生數據的原因主題。我覺得這很令人費解。另外,爲什麼控制器沒有看到明顯正在發送的關鍵「等級」?此外,還有另一種方法(讀得更好)來測試params散列中的鍵的存在嗎?簡而言之,這裏有什麼不對,這樣才能真正起作用?

TIA

回答

0

部分你的問題就在這裏:

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是否有鑰匙,替代品有問題。

+0

開始GET「/map.json?grade=11」爲127.0.0.1於2012-12-20 12:01:50 -0700 通過MapController處理#index爲JSON 參數:{「grade」=>「 11「} 在193毫秒內完成500次內部服務器錯誤 參數錯誤(未知鍵:等級): app/controllers/map_controller.rb:6:在'索引' – SteveMustafa

+0

由於某種奇怪的原因,我無法添加另一行評論。但以上是終端日誌中的直接副本和貼子。年級在那裏,但我不知道發生了什麼阻止它看到它。 – SteveMustafa

+0

對於這個問題可能更容易添加,評論不會很好地處理這樣的事情。 –