2017-03-05 13 views
0

レールアプリにajaxドロップダウンを実装しようとしています。カテゴリを選択すると、サブカテゴリのドロップダウンで、選択したカテゴリに従ってサブカテゴリが設定されます。現在、カテゴリを選択して「フィルタ」を入力して次のページに移動したときにのみ、サブカテゴリのドロップダウンが表示されます。これは、JSはこれがindex.html.erbある equipment.jsレールアプリにajaxドロップダウンを実装しようとしています

$(document).ready(function($) { 


    // Fetch sub-categories as per category selected 
    $("select#category_id, select#wanted_equipment_category_id").selectric().change(function(e){ 
    $.getJSON("/fetch_sub_categories",{category_id: $(this).val(), ajax: 'true'}, function(response){ 
     var options = ''; 
     for (var i = 0; i < response.length; i++) { 
     options += '<option value="' + response[i].id + '">' + response[i].name + '</option>'; 
     } 
     if (e.target.id=="category_id"){ 
     $("select#sub_category").html('<option value="">Sub-Category</option>'+options); 
     var Selectric = $('select#sub_category').data('selectric'); 
     Selectric.init(); 
     } 
     if (e.target.id=="wanted_equipment_category_id"){ 
     $("select#wanted_equipment_sub_category_id").html('<option value="">Select Sub-Category</option>'+options); 
     var Selectric = $('select#wanted_equipment_sub_category_id').data('selectric'); 
     Selectric.init(); 
     } 
    }) 
    }) 

    $(document).ajaxStop(function() { 
    $('.loader').hide(); 
    }); 

    $(document).ajaxStart(function() { 
    $('.loader').show(); 
    }); 

}); 

を提出さ

def index 
    @categories = Category.roots.active.all 
    if (params.keys & ['category_id', 'sub_category_id']).present? 
    if params[:category_id].present? 
     @category = Category.active.find params[:category_id] 
    else 
     @category = Category.active.find params[:sub_category_id] if params[:sub_category_id].present? 
    end 
    end 
    @root_categories = Category.active.roots 
    @sub_categories = @category.children.active if params[:category_id].present? 
    @sub_categories ||= {} 

    @wanted_equipments = WantedEquipment.Approved.filter(params.slice(:category_id, :sub_category_id)).order("created_at desc").page(params[:page]).per(per_page_items) 

end 
def fetch_sub_categories 
    category = Category.active.where(id: params[:category_id].to_i).first 
    sub_categories = category.present? ? category.children.active : [] 
    render json: sub_categories, status: 200 
    end 

コントローラを次のように私は、コントローラのメソッドを持っていますファイル

<%= form_tag filter_wanted_equipments_path, :method => 'get' do %> 
        <%= select_tag "category_id", options_from_collection_for_select(@categories, "id", "name", params[:category_id]), :prompt=>"Select Category", id: "search_category" %> 
        <%= select_tag "sub_category_id", options_from_collection_for_select(@sub_categories, "id", "name", params[:sub_category_id]), :prompt=>"Sub-Category" %> 
        <%= hidden_field_tag('category_id', params[:category_id]) if params[:category_id].present? %> 
        <%= hidden_field_tag('sub_category_id', params[:sub_category_id]) if params[:sub_category_id].present? %> 
        <%= submit_tag "filter-", :name => nil, style: "display:none;", id: 'filter-submit' %> 
       <% end %> 

routes.rbをファイル

resources :wanted_equipments do 
get "/fetch_sub_categories" => 'wanted_equipments#fetch_sub_categories' 

     collection do 
      get 'search' 
      get 'filter' 
     end 
     end 

答えて

0

http://blog.ashwani.co.in/new/2017/03/06/How-to-use-create-ajax-dropdown-from-database-models-in-Rails.html

コード:

index.html.erb

<div> 
<%= f.collection_select :vertical, @verticals, :vertical, :vertical, {:prompt => "Select a Vertical"}, {:class => "dropdown_vertical btn btn-default dropdown-toggle"} %> 
<%= f.collection_select :subVertical, @subVerticals, :subVertical, :subVertical, {:prompt => "Select a Sub Vertical"}, {:class => "dropdown_subVertical btn btn-default dropdown-toggle"} %> 
</div> 

custom.js

ここでは
$("#search_vertical").on('change', function(){ var listitems = []; $.ajax({ url: "populate_subVerticals", type: "GET", data: {vertical_name: $(this).val()}, success: function(data) { $("#search_subVertical").children().remove(); $("#search_subVertical").append('<option value=>' + "Select a Sub Vertical" + '</option>'); $.each(data,function(key, value) { listitems += '<option value="' + value.subVertical + '">' + value.subVertical + '</option>'; }); $("#search_subVertical").append(listitems); } }) }); 

コントローラ

def populate_subVerticals vertical_name = params[:vertical_name] @verticals = Vertical.where(:vertical => vertical_name).select("id","subVertical").all respond_to do |format| format.json { render json: @verticals } end end 

routes.rbをファイル

'populate_subVerticals', to: 'verticals#populate_subVerticals' 
0

は、私は、ダイナミックドロップダウンを移入するために使用しているどのようなコードの一部です。

index.html.erb - > dd1_idは静的なドロップダウンで、dd1_idが選択されるとdd2_idドロップダウンが入力されます。

<tr> 
    <td class="td1"></td> 
    <td class="td2"><span class="">Drop Down 1:</span></td> 
    <td><%=f.select :dd1_id, options_for_select(@abc.collect { |abc| [abc.type_name.upcase, abc.type_name.upcase] }, 0), {prompt: "-- Select --"}, { id: 'dd_1_select',:style => "width:300px"} %></td> 
    </tr> 

    <tr> 
    <td class="td1"></td> 
    <td class="td2"><span class="">Drop Down 2:</span></td> 
    <td><%=f.select :dd2_id, options_for_select([""]), {}, {:id => "dd_2_select",:style => "width:300px;"} %></td> 
    </tr> 

device.js - >これはURLをdd1_id値をキャプチャし、ヒットdd1_idドロップダウンが値で選択されているかどうかを確認してからupdate_dd2と呼ばれる機能をトリガーするのonchange機能は、以下に指定していますajaxリクエストで

$('#dd_1_select').on('change', function(){ 
    if ($("#dd_1_select option:selected").val() != ""){ 
    update_dd2(); 
    $('#dd_2_select').val(''); 
    } 
}); 

function update_dd2() { 
    $.ajax({ 
     url: '/update_dd_2', 
     data: { 
      dd1_value: $("#dd_1_select option:selected").val() 
     }, 
     method: 'GET', 
     dataType: 'script', 
     beforeSend: function(xhr) {xhr.setRequestHeader('X-CSRF-Token', $('meta[name="csrf-token"]').attr('content'))}, 

     success: function(){ 
      console.log("Dynamic dd_2 select OK!"); 
      $('#dd_2_select').prop('disabled',false); 
     }, 
     failure: function(error){ 
      console.log("AJAX FAILURE: "+error); 
      alert("Something went wrong, Please try again later."); 
     }, 
     error: function(error){ 
      console.log("AJAX ERROR: "+error); 
      alert("Oops! there was an error, Please reload the page and try again."); 
     } 
    }); 
} 

}

routes.rbを - から選択された値に基づいて> - > AJAXリクエストで指定されたURLは、アクション

get "update_dd_2" => "abc#update_dd_2", :as => "update_dd_2" 

コントローラ/アクションにリダイレクトされます最初のドロップダウン、それは2番目のドロップダウンを埋めるために必要なデータを取得します

def update_dd_2 
     @values = SomeTable.where("id in (?)", params[:dd1_value]) 
     respond_to do |type| 
     type.js 
     end 
    end 

dd1_value .js - >上記の動作は、次のように期待します。jsファイルを表示 これはhtmlファイルへの部分的な応答をレンダリングし、ドロップダウンには適切な値が入力されます

$("#dd_2_select").empty().append("<%= escape_javascript(render(:partial => @values)) %>"); 
関連する問題