Фильтровать результаты на странице индекса из выпадающего списка - PullRequest
6 голосов
/ 31 января 2011

Я использую рельсы 3, и у меня есть две модели, места и области, где каждая область имеет много мест, и каждое место принадлежит одной области.

Я пытаюсь найти способ фильтрации записей места, отображаемых в индексе места, по тому, какая область выбрана в раскрывающемся списке на той же странице.

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

Области, которые у меня есть в модели, отображают правильные места при вызове в консоли rails или путем изменения индекса def в контроллере на @venues = Venue.north / venue.south / venue.west. Я просто не могу придумать способ отобразить все места по умолчанию, но затем вызвать каждую область в зависимости от того, какая область выбрана из формы.

На данный момент я не беспокоюсь об использовании AJAX. Я просто хотел бы понять, как это можно сделать как можно более простым способом без использования sphinx /inking_sphinx.

Модель:

class Venue < ActiveRecord::Base
  belongs_to :user
  has_many :reviews
  belongs_to :area

  scope :north, where(:area_id => "2")
  scope :west, where(:area_id => "3")
  scope :south, where(:area_id => "4")
end

Просмотр: (место индекса.html.erb)

<div class="filter_options_container">

  <form class="filter_form">
    <%= select("area", "area_id", Area.all.map {|a| [a.name, a.id] }) %>
    <input type="submit" value="Filter" />
  </form>
</div>

<div class="venue_partials_container">
  <%= render :partial => 'venue', :collection => @venues %>
</div>   

Контроллер:

class VenuesController < ApplicationController

  def index
    @venues = Venue.all
  end
end

Любая помощь очень ценится.

1 Ответ

9 голосов
/ 31 января 2011

Вы можете найти Места в вашем контроллере в зависимости от того, выбрана ли область или нет. Вы можете изменить представление так, чтобы оно отправляло имя области вместо идентификатора области (что может упростить задачу):


<%= select("area", "name", Area.all.collect(&:name)) %>

Контроллер будет выглядеть примерно так -


def index
  if (params[:area] && Area.all.collect(&:name).include?(params[:area][:name]))
     @venues = Venue.send(params[:area][:name].downcase)
  else
     @venues = Venue.all
  end
end

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...