1

OK、これはフラストレーションの別の演習です。私は一生、何が悪いのか理解できません。

コントローラ:

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) が返されますが、これは -1 の ID が返されているため理解できますが、console.log(data) が生徒のデータを記録していて記録していない理由にはなりません。件名。これは非常に不可解だと思います。また、明らかに送信されているキー「グレード」がコントローラに表示されないのはなぜですか? さらに、params ハッシュにキーが存在するかどうかをテストする別の方法 (よく読んでください) はありますか? 一言で言えば、これが実際に機能するために、ここで何が間違っているのでしょうか?

ティア

4

1 に答える 1

0

あなたの問題の一部はここにあります:

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

と言うとobj.to_json、String が返されます。JSON 表現を含む String ですobjが、それでも String です。したがって、 を要求されるmap.jsonと、サーバーは最終的に次のように処理します。

render :json => some_string_that_is_already_json

二重にエンコードされたデータをクライアントに送り返すことになります。この$.getJSON呼び出しでは、JSON エンコードされた JSON 文字列ではなく、JSON 文字列が想定されているため、適切な処理が行われることは期待できません。JavaScriptconsole.log(data)オブジェクトのように見えますが、見た目は誤解を招く可能性があります。JSON 文字列は、コンソール内のオブジェクトと非常によく似ています。

コントローラーが を取得していない理由については:grade、 の内容をparam確認してください。ログですぐに利用できるはずです。

そして、鍵があるかどうかを確認params.has_key?する正しい方法です。代替手段には問題があります。params

于 2012-12-20T07:39:25.457 に答える