2017-09-29 77 views
2

我試圖在選擇州和城市時顯示圖表。選擇下拉列表中的值後Div未更新

根據第一個下拉列表中的狀態選擇填充城市下拉列表。

問題是當我點擊一個城市沒有圖表顯示,也沒有更新,如果我改變選擇,我似乎無法弄清楚問題。

我正在使用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 %> 

注意:如果我手動替換控制器中的動態查詢中的city_id,使用隨機id,當刷新頁面時會顯示相應城市的圖表,但我不知道它爲什麼不動態工作

+0

是您在城市工作的點擊事件嗎? 。我的意思是,當你改變城市時,它是否會觸及服務器。 – krishnar

+0

嗨@krishnar再次感謝您的回答!是的,當我更改城市時,我可以在終端中看到新的city_id,以及瀏覽器的控制檯 – GeoSal

+0

,對於遲到的回覆感到抱歉。你能檢查我的解決方案嗎? – krishnar

回答

1

1.update您city_stats方法如下面

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

2.下面的代碼

$("#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]) 

此行不會返回您的編號。它僅返回一個只有一個字段(id)加載的模型實例。嘗試將其更改爲

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

這會給你一個數字。

另外,正如我所看到的,在您的AJAX處理程序$("#city_name").on('click')中,您實際上並未使用生成的圖表更新您的視圖。

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

(這就是爲什麼當city_id手動設置一切正常),使每個AJAX請求,這並不完全刷新你的頁面,你替換該行被評估一次,在HTML頁面的初始渲染$('#stats')具有相同的內容。

順便說一句,一旦您替換$('#stats'),下次不會在整個頁面重新渲染時訪問它,因爲它會從DOM中移除。參見參考文獻(replaceWith)。

我認爲,在AJAX的情況下,最好在$('#stats')容器上使用.empty(),然後在裏面使用.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請求時,它會與

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

結束所以,你要麼返回兩個@cities並呈現局部這裏,並在有關的成功回調,或爲每個請求以某種方式單獨的反應中使用它們。

關於代碼的一兩件事 - 這不是很好的事件處理程序綁定了$("#city_name")$("#city_state")變化處理程序中,因爲你添加相同的處理程序$("#city_name")點擊$("#city_state")每一個變化,每次點擊這個處理程序將被執行儘可能多的次數。在綁定之前可以使用.off來防止這種情況,但也許值得做一些重構。

+0

謝謝你的回答Maksim,不幸的是,沒有解決問題..我得到了未定義的方法'id'爲零:NilClass – GeoSal

+0

另外,當我打印查詢時,我確實看到city_id作爲數字 – GeoSal

+0

下面是對終端在我選擇城市後:SELECT COALESCE(名稱)作爲名稱,count(*)FROM(SELECT name,regs.segment_id,count(*)FROM regs INNER JOIN segments 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