2016-02-26 2 views
0

У меня есть countries, states & cities Базы данных с их моделями Country, State & City.Ruby on Rails - Состояние загрузки и город при выборе страны и государства

Текущие ассоциации:

class Country < ActiveRecord::Base 
    has_many :states 
end 

class State < ActiveRecord::Base 
    belongs_to :country 
    has_many :cities 
end 

class City < ActiveRecord::Base 
    belongs_to :state 
end 

В настоящее время Im используя эту JQuery, чтобы показывать только состояния на основе выбранной страны, но она по-прежнему загружает все состояния в некоторой [опции], который замедляет загрузку страницы.

- jQuery -> 
    states = $('#q_state_id_eq').html() 
    update_states = -> 
    country = $('#q_country_id_eq :selected').text() 
    options = $(states).filter("optgroup[label=#{country}]").html() 

    if options 
     $('#q_state_id_eq').html(options) 
     # Add in a blank option at the top 
     $('#q_state_id_eq').prepend("<option value=''></option>") 
     # Ensure that the blank option is selected 
     $('#q_state_id_eq option:first').attr("selected", "selected"); 
    else 
     $('#q_state_id_eq').empty() 

    $('#q_country_id_eq').change -> 
    update_states() 

    update_states() 

В моей форме (Я использую Simple_form_for), как я могу добавить collection_select/выберите для countries, states & cities и ТОЛЬКО НАГРУЗКИ, состояний когда страна выбрана и нагрузки города, когда состояние выбрано?

PS: Нагруженные состояния и города должны быть основаны на том, какая страна и состояние выбрано.

Есть ли какой-либо жемчуг для того, что я ищу, или решение Ajax? (другие решения также оценены)

+0

Это называется каскадным выпадающим списком (https://www.google.com.br/search?q=cascading+dropdowns+in+rails&gws_rd=cr,ssl&ei=vTHQVvDHH4mowASrraTgAQ). – Mohamad

+0

@ Mohamad Tnx, все еще загружает состояния и города в загрузку страницы или только когда выбрана страна и состояние? – Rubioli

+0

Это зависит от вашей реализации. Я ссылаюсь на поиск в Google «каскадные выпадающие списки в Rails», а не на конкретную реализацию. Посмотрите на некоторые ссылки, и я уверен, что вы найдете несколько хороших способов сделать это. – Mohamad

ответ

1

Вы можете сделать это в рельсах без использования какого-либо драгоценного камня.

f.collection_select(:state_id, State.all, :id, :name, {},{:data => { :remote => true, 
       :url => url_for(:controller => "states", 
           :action => "display_cities") 
      } 
    } 
) 

В действии display_cities фильтровать города на основе state_id. Используйте display_cities.js.erb для заполнения элемента div новым сгенерированным html.

+0

Tnx, в настоящее время у меня нет контроллеров для стран, штатов и городов. Нужно сделать их первыми? – Rubioli

+0

Нет необходимости. это не что-то обязательное, вы можете продолжить работу с контроллером, который используете. Но для лучшей практики вы можете сгруппировать подобные действия под именем класса – Bijendra