2016-08-01 3 views
1

Я пытаюсь настроить динамические выпадающие меню выбора в форме поиска, используя form_tag. То, что я хотел бы похожа функциональность на примере найденного в Railcasts #88Rails4 Dynamic Select Dropdown

Модели:

class Count < ActiveRecord::Base 
    belongs_to :host 
end 

class Host < ActiveRecord::Base 
    belongs_to :site 
    has_many :counts 
end 

class Site < ActiveRecord::Base 
    belongs_to :state 
    has_many :hosts 
end 

class State < ActiveRecord::Base 
    has_many :sites 
end 

Вид:

<%= form_tag(counts_path, :method => "get", id: "search-form") do %> 
    <%= select_tag "state_id", options_from_collection_for_select(State.all.order(:name), :id, :name) %> 
    <%= select_tag "site_id", options_from_collection_for_select(Site.all.order(:name), :id, :name) %> 
<% end %> 

Государство, has_many сайты, которые has_many Хосты, которая имеет множество графов. Или, наоборот, Counts принадлежит_у Host, который принадлежит_ сайту, принадлежащему государству

Поэтому я хотел бы выбрать состояние из раскрывающегося списка States, которое затем «группировало» сайты на основе состояния, которое они связывают через Host.

Я боролся с этой вложенной ассоциацией и не могу понять, как построить grouped_collection_select.

Я знаю, что упускаю из виду что-то очевидное! Не могли бы использовать некоторые указатели ...

ответ

1

Вы можете запустить запрос jquery-ajax. Изменение события в первом поле выбора вызовет действие на контроллере, и вызываемый метод изменит значение второго выпадающего списка через ajax-вызов. Простой пример:

В файле вида:

<%= select_tag 'state_id', options_for_select(State.all.order(:name), :id, :name) %> 

<%= select_tag "site_id", options_for_select(Site.all.order(:name), :id, :name) %> 

В JS файл этого контроллера:

$(document).on('ready page:load', function() { 
$('#state_id').change(function(event){ 
     $("#site_id").attr('disabled', 'disabled')   
     $.ajax({ 
    type:'post', 
    url:'/NameOfController/NameOfMethod', 
    data:{ state_id: $(this).val() }, 
    dataType:"script" 
    }); 
    event.stopImmediatePropagation(); 
}); 

});

В NameOfController.rb

def NameOfMethod 
    ##no need to write anything 
end 

В NameOfMethod.js.erb

<% if params[:state_id].present? %> 
    $("#site_id").html("<%= escape_javascript(render(partial: 'site_dropdown'))%>") 
<% end %> 

в _site_dropdown.html.erb файле:

<% if params[:state_id].present? %> 
    <%= select_tag 'site_id', options_for_select(Site.where("state_id = ?", params[:state_id])) %> 
<% else %> 
    <%= select_tag "site_id", options_for_select(Site.all.order(:name), :id, :name) %> 

Так изменится сайт раскрывающийся список, основанный на выпадающем списке выбранного состояния. Вы можете пойти до n уровня уровня для поиска. Удачи.