Как вывести записи с определенным значением(из select)?

Есть 2 сущности:
class Ad < ActiveRecord::Base
  belongs_to :city
  attr_accessible :title, :text, :number, :published_date, :city_id
end

class City < ActiveRecord::Base
  has_many :ads
  attr_accessible :name, :ad_id  
end


и есть вьюха
<h1>Список объявлений</h1>

<%= link_to 'Новое объявление', new_ad_path %><br/><br/>

<%= label :city, 'Город: ' %>
<%= collection_select(:ad, :city_id, City.all, :id, :name, prompt: 'Выберете город...') %><br/>

<br/>
<table>
<% @ads.each do |ad| %>
    <h2><%= link_to ad.title, ad %></h2>
    <%= ad.text %><br/>
    <strong>Город: </strong><%= ad.city.name %><br/>
    <strong>Дата публикации: </strong><%= ad.created_at %>
<% end %>
</table>

<br/>
<%= will_paginate @posts%>

Не могу никак понять, как сделать так, чтобы при выборе конкретного поля в collection_select он ниже выдавал записи только с этим городом. Смотрел 88 скринкаст динамические селекты, там говорится как от одного другое вывести, да и в основном все что находил, везде были селекты от селектов. Можете подкинуть пример или помочь найти то, что я ищу? Заранее спасибо всем кто откликнется.
  • Вопрос задан
  • 2459 просмотров
Решения вопроса 1
Jeiwan
@Jeiwan
1. Посылаем запрос при выборе элемента из селекта:
collection_select(:ad, :city_id, City.all, :id, :name, {prompt: 'Выберете город...'}, data: {remote: true, type: :json, url: ads_path})

Запрос уходит на ads_path (то есть экшн index контроллера ads), id города передается в параметре ad[city_id].

2. В экшене возвращаем список объявлений города:
respond_to :json
def index
  @city = City.find(params[:ad][:city_id])
  respond_with @ads = @city.ads
end


3. На js ловим ответ сервера с данными:
$ ->
  $("#ad_city_id").on "ajax:success", (e, data, status, xhr) ->
    objects = xhr.responseJSON

В переменной objects будут находиться объявления, которые мы потом рендерим на страницу. То есть вся работа по выводу объявлений на страницу переносится на клиент, т.е. js. Очень удобно это делать с помощью гема handlebars_assets и, соответственно, шаблонов в формате handlebars. Отдавать красивый json можно с помощью гема jbuilder.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
Boniface
@Boniface
К счастью не знаком с Rails. Но на angular.js это делается элементарно благодаря биндингам. Рекомендую посмотреть в его сторону. На сколько помню у рельс есть проект Api только для REST с урезанными контроллерами и без AcriveRecord. Обратите внимание на него.

Конкретно по вашей ситуации. Придется делать при выборе города в поле select запрос на сервер для получения городов и отображать их так как вы это делаете сейчас. Если связь 1:m или просто выводить значение если 1:1. Ну и конечно при загрузке по дефолту города в select, у вас уже должен быть подтянута связанная запись.

Удачи!
Ответ написан
Ваш ответ на вопрос

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

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