2017-09-27 16 views
1

私のレールプロジェクトの別のドロップダウンリストの選択に基づいて1つのドロップダウンリストを設定しようとしています。唯一の違いは、両方のドロップダウンリストが1つのモデルから作成されることです。別のドロップダウンリストから値を選択すると、ドロップダウンリストに入力されます

モデルはであり、それは、状態を持っています。

は都市名であり、は市が属する州です。 例えば、都市オブジェクトは、次のようになります。私はRails 4: How to update a collection_select based on another collection_select through AJAX? や他のリンクをチェックしましたが、私は市が最初のものと同じモデルからドロップダウンリストを移入する方法を見つけ出すように見えることはできません

id = 1 
name = LOSANGELES 
state = CA 

ドロップダウン

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

コントローラ/ city_stats_controller.rb:

def city_stats 
@state = params[:state] 
@cities = City.select(:name).all.where(:state => state) 

respond_to do |format| 
    format.json { render :json => @cities }  
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'), :id, :state, {:prompt => 'Select a State'}, {id: 'state', multiple: false} %> 

    <label>City <span>*</span></label> 
    <%= collection_select :city, :name, [], :id, :name, {:prompt => 'Select a City'}, {id: 'name', multiple: false} %> 
</div> 

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

は、すべてのヘルプははるかに高く評価されます!

+0

問題は何ですか?何かエラーが出ていますか?コードのどの部分がうまくいかないのですか? – krishnar

+0

@krishnar私はエラーはありません。最初のドロップダウンリストから特定の状態を選択した後、都市のドロップダウンリストに値が入力されていないだけです。 – GeoSal

+1

州のドロップダウン値が変更されたときにリクエストを受け取りますか? – krishnar

答えて

1

あなたのcity_statsメソッドを変更します。このメソッドは、idと名前

def city_stats 
    @state = params[:state] 
    @cities = City.where(:state => state).select(:id, :name) 

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

が応答でthis.SinceデータなどのAJAX呼び出しであなたの各機能を変更返す必要があり、我々はvalue.id、value.nameを使用しているオブジェクトの配列です。

$.each(data,function(key, value) { 
    listitems += '<option value="' + value.id + '">' + value.name + '</option>';  
}); 
+0

私は(city_stats)でcity_statsではないコントローラのアクションの名前を混乱させたと思います。最初のselectのidはstateですが、idの2番目のidはcity – GeoSal

+0

です。idはカラム自体の名前ですか?最初のcollection_selectの場合と同じように、idは状態になり、2番目のものはnameになります。 – GeoSal

+0

私が混乱しているのは、名前と州の両方が同じクラスの都市内にあるという事実です。だから私はそこに何を置くべきかはわかりません。 – GeoSal

関連する問題