Как создать и заполнить связанные выпадающие списки на Rails?

Здравствуйте. Созрел вопрос, ответа на который у меня пока нет, но надеюсь с вашей помощью я доберусь до истины. Приложение на RubyOnRails 4. Используется гем simple_form. Есть три модели
shop, city, district (магазины, города и районы соответственно)

shop:
belongs_to :district

district:
belongs_to :city

city
mas_many :districts

В таблице магазинов присутствует ссылка на id района. В таблице районов ссылка на id города. Из магазина могу найти район shop.district или город: shop.district.city

Задача с наименьшими усилиями создать форму редактирования магазина, на которой будут отображаться 2 выпадающих списка: Город, Район

Создать и заполнить списки могу. Загвоздка в том, что список возможных вариантов районов зависит от выбранного города. Как малой кровью обойтись? Привык, что на Rails велосипеды почти не нужно создавать.

Наткнулся на подобный вопрос . Не плохое решение в принципе. Здесь в одном списке появляются и районы и города. Районы сгруппированы по городам. Для меня не подошло, слишком длинный список получается. Нужно разделить на два списка.

Из велосипедов напрашивается Ajax, либо грузануть сразу все выпадающие списки районов, для каждого города и скрывать/отображать нужный в зависимости от выбранного города. Но это не красиво и многословно получится. Есть уже готовое решение?
  • Вопрос задан
  • 1416 просмотров
Решения вопроса 1
Пригласить эксперта
Ответы на вопрос 1
@sunnmas Автор вопроса
Ruby
пока получилось методом костыля:
<% cities = City.all.map{|city| [city.name, city.id]}%>
<%= select_tag(:city_id, options_for_select(cities)) %>
<% for city in cities %>
<%= select_tag("district_id_"+city[1].to_s, 
		options_for_select(District.where(:city_id => city[1]).map{|d| [d.name, d.id]})) %>
<% end %>

Это создало список городов и кучу списков районов
Далее разруливаем в браузере:
<script>
	$("[name ^= district_id]").hide();
	$("[name = district_id_1]").show();
	$("[name = city_id]").change(function(){
		cur_district = $("[name = 'adv[district_id]']");
		cur_district.attr("name",cur_district.attr("id"));
		$("[name ^= district_id]").hide();
		$("[name = district_id_"+$(this).val()+"]").
				attr("name","adv[district_id]").show();
	});
</script>
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы