2017-09-29 14 views
2

州と都市を選択したときにグラフを表示しようとしています。ドロップダウンリストで値を選択した後に部門が更新されない

都市のドロップダウンリストは、最初のドロップダウンの状態の選択に基づいて作成されます。

問題は、都市をクリックするとグラフが表示されず、選択を変更しても更新されず、問題を把握できないように見えることです。

私はChartKickを使用して、コントローラのクエリで指定された値を持つ円グラフを表示しています。

次のように私のコードは次のとおりです。

コントローラ/ city_stats_controller.rb:

def city_stats 
    @state = params[:state] 
    @cities = City.where(:state => @state).select(:id, :display_name).uniq.order('display_name ASC') 
    # @city_id = City.select('id').where(:state => params[:city_state]).where(:name => params[:city_name]) 
    @city_id = City.select('id').find_by_id(params[:city]) 

    dynamic_query = ActiveRecord::Base.send(:sanitize_sql_array, ['SELECT COALESCE(name) as name, count(*) FROM (SELECT name, regs.segment_id, count(*) FROM regs 
    INNER JOIN segments ON regs.segment_id = segments.id 
    WHERE regs.city_id = ? 
    GROUP BY segment_id, name 
    ORDER BY count(*) DESC) as tabe 
    GROUP BY name;', @city_id]) 

    @spatial_ratio = ActiveRecord::Base.connection.select_all(dynamic_query) 

    puts @city_id.inspect #I can see the value printed in the terminal 
    puts @spatial_ratio.inspect #Same here, even after changing the selection 

    respond_to do |format| 
    format.json { render :json => @cities } 
    format.js { 
     render json: { 
     html: render_to_string(
      partial: 'city_stats', 
      locals: { 
      city_id: @city_id, 
      spatial_ratio: @spatial_ratio 
      }) 
     } 
    } 
    format.html 
    end 
end 

ビュー/ city_stats/city_stats.html.erb:

<div class="row"> 
    <label>State <span>:</span></label> 
    <%= collection_select :city, :state, City.select(:state).uniq.order('state ASC'), :state, :state, {:prompt => 'Select a State'}, {id: 'city_state', multiple: false} %> 
    <label>City <span>:</span></label> 
    <%= collection_select :city, :name, [], :name, :name, {:prompt => 'Select a City'}, {id: 'city_name', multiple: false} %> 
</div> 
<div id="cities"> 
<!-- Here I render the cities list upon selecting a state--> 
<%= render :partial => 'city_stats', :object => @cities %> 
</div> 

<div id="stats"> 
</div> 

<script type="text/javascript"> 

$(document).ready(function() { 
$("#city_state").on('change', function(){ 
    $.ajax({ 
    url: "/admin/city_stats", 
    type: "GET", 
    data: {state: $(this).val()}, 
    success: function(data) { 
    $("#city_name").children().remove(); 
    // Create options and append to the list 
    var listitems = []; 
    $.each(data,function(key, value) { 
     listitems += '<option value="' + value.id + '">' + value.display_name + '</option>';  
    }); 
    $("#city_name").append(listitems); 

    //console.log(listitems); 

    $("#city_name").on('click', function(){ 
    $.ajax({ 
     url: "/admin/city_stats", 
     type: "GET", 
     data: {city: $(this).val()}, 
     success: function(data) { 
     var content = $("#city_name").val() 
     console.log(content); 
     $('#stats').replaceWith("<%= j render(partial: 'city_stats') %>"); 
     return content; 

     } 
    }) 

    }) 
    } 
}) 

}); 
}); 

と部分で:ビュー/city_stats/_city_stats.html.erb:

<%= pie_chart @spatial_ratio.rows %> 

NBコントローラの動的クエリのcity_idを手動でランダムidに置き換えた場合、ページを更新すると対応する都市のグラフが表示されますが、動的に動作しない理由はわかりません。

+0

市のクリックイベントは機能していますか? 。私はあなたが都市を変えるとき、それがサーバーを打つのを意味します。 – krishnar

+0

こんにちは@krishnarあなたの答えをもう一度感謝!はい、私は都市を変更すると、私はターミナルでだけでなく、ブラウザのコンソールで新しいcity_idを見ることができます – GeoSal

+0

遅く応答して申し訳ありません。私のチェックの解決策はできますか? – krishnar

答えて

1

def city_stats 
    ... 
    ... 
    respond_to do |format| 
    format.json { render :json => @cities } 
    format.js 
    end 
end 

2.以下のような1.updateあなたcity_stats方法は、コード

$("#stats").html("<%= escape_javascript(pie_chart @spatial_ratio.rows) %>"); 

3のように変更あなたのcity_clickイベントを以下でcity_stats.js.erbファイルを作成しますこの

$("#city_name").on('click', function(){ 
    $.ajax({ 
     url: "/admin/city_stats", 
     type: "GET", 
     data: {city: $(this).val()}, 
     success: function(data) { 
     } 
    }) 
    }); 

これは問題を解決するはずです。問題/疑問点のコメントがある場合

+0

あなたの助けに@krishnarをありがとうございます..まだ私の問題を解決していない、一度都市を選択すると、ビューに何も表示されません:/ – GeoSal

+1

@GeoSalは私をチャットに招待します。あなたの問題を解決するために議論します – krishnar

+0

私はチャットを開始するのに十分な評判を持っているとは思わない、あなたは私を招待できますか? – GeoSal

1
@city_id = City.select('id').find_by_id(params[:city]) 

この行には番号が返されません。 1つのフィールド(ID)だけがロードされたモデルのインスタンスを返します。変更するには

@city_id = City.select('id').find_by_id(params[:city]).id 

これはあなたに番号を与えます。

また、AJAXのハンドラでは$("#city_name").on('click')に表示されていますが、実際には生成されたグラフでビューを更新することはありません。あなたが交換する、完全に自分のページをリロードしない各AJAX要求、上のよう

<%= j render(partial: 'city_stats') %> 

この行は、(city_idが手動で設定されたときにすべての作品理由です)htmlページの最初のレンダリングには、一度だけ評価されます$('#stats')と同じ内容です。 ところで、一度あなたが$('#stats')に置き換えられると、DOMから削除されるため、ページのトータルレンダリングなしに次回アクセスしません。 (replaceWith)の参照を参照してください。

AJAXの場合は、を$('#stats')コンテナに、次に.append()新しいチャートを使用する方が良いと思います。

考えられるのは、ページをリロードせずにグラフを更新する場合は、サーバーの新しいデータを使用する必要があるということです。

success: function(data) { 

場合によっては、変数dataの内部になります。

私はあなたのコントローラにあなたがこれを持っていることを参照してください。

format.js { 
    render json: { 
    html: render_to_string(
     partial: 'city_stats', 
     locals: { 
     city_id: @city_id, 
     spatial_ratio: @spatial_ratio 
    }) 
    } 
} 

だから、あなたはあなたのハンドラ内でこのデータを使用する必要があります。

success: function(data) { 
    $('#stats').empty().append(data.html); 
} 

しかし、現在の実装では到達可能かどうかはわかりません。私はあなたがAJAX要求を行うたびに、それはあなたが両方@citiesを返さなければならないのいずれかと、ここで部分的にレンダリング

format.json { render :json => @cities } 

で終わり、および関連する成功のコールバック、または各要求に対して何らかの形で別の回答でそれらを使用することを推測します。

コードについてもう一つ - それはので、あなたが$("#city_name")クリックで同じハンドラを追加$("#city_state")のあらゆる変化に、$("#city_state")の変更ハンドラ内$("#city_name")のイベントハンドラをバインドするためによくない、とそれぞれこのハンドラをクリックする上で実行されますそれが拘束された回数だけ。これを防ぐためにバインドする前に.offを使用できますが、リファクタリングを行う価値はあります。

+0

あなたの答えをありがとうございますMaksim、残念ながらそれは問題を解決しませんでした。私はnilのための 'id 'は未定義メソッドを持っています:NilClass – GeoSal

+0

また、私は数字としてcity_idを参照してくださいクエリを印刷する – GeoSal

+0

(*)FROM(名前の選択、regs.segment_id、count(*)from regs INNER JOINセグメントON regs.segment_id = segments.id WHERE regs。 city_id = 354 GROUP BY segment_id、名前 ORDER BY count(*)DESC)as tabe GROUP BY name; – GeoSal

関連する問題