Rails: фильтровать индекс через выпадающий список и флажки - PullRequest
0 голосов
/ 24 сентября 2011

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

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

Код, который у меня есть на данный момент, предоставляет выпадающий список и флажки, но есть некоторые проблемы:

  • флажки перечисляют все категории, но когда я фильтрую по этим параметрам, параметры передаютсякак массив, но никакие продукты не возвращаются в представлении
  • всякий раз, когда я фильтрую по категории, я теряю предыдущий выбор местоположения

Вот соответствующий код:

Модель продукта

....
has_many :categorizations
has_many :categories, :through => :categorizations
has_many :localizations
has_many :locations, :through => :localizations
class Product < ActiveRecord::Base
default_scope :order => 'end_date'
scope :not_expired, where('end_date > ?', Time.now)
scope :location, lambda { |*location_id| {:include => :locations, :conditions => ["locations.id = ?", location_id]} }
scope :category, lambda { |*category_id| {:include => :categories, :conditions => ["categories.id = ?", category_id]} }
scope :unique, :group => "title"

Контроллер

class LibraryController < ApplicationController
  def index
    if params[:location_id] && params[:category_ids]
    @products = Product.not_expired.unique.location(params[:location_id]).category(params[:category_ids]).paginate(:page => params[:page], :per_page => 9)
    elsif params[:category_ids]
    @products = Product.not_expired.unique.category(params[:category_ids]).paginate(:page => params[:page], :per_page => 9)
    elsif params[:location_id]
    @products = Product.not_expired.unique.location(params[:location_id]).paginate(:page => params[:page], :per_page => 9)
    else
    @products = Product.not_expired.unique.paginate(:page => params[:page], :per_page => 9)
    end
  end
end

Библиотека index.html.erb

<% if notice %>
<p id="notice"><%= notice %></p>
<% end %>

      <div class="filter_options">

        <form class="filter_locations", method="get">
          <% @options = Location.all.map { |a| [ a.name, a.id ] } %>
          <%= select_tag "location_id", options_for_select(@options), :onchange => "this.form.submit();", :include_blank => true %> 
        </form>

        <form class="filter_categories", method="get">
          <% for category in Category.all %>
            <%= check_box_tag("[category_ids][]", category.id) %>
            <%= category.name %>
          <% end %>
          <input type="submit" value="Filter" />
        </form>
    </div>

Я ходил кругами с этим, поэтому любое направление очень ценится.

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

Дальнейшее обновление - я добавил проверку того, установлен ли флажок категории путем запроса параметров,библиотека ed index.html.erb ниже.

Последнее редактирование с включенным вводом @rdvdijk (Спасибо)

Библиотека index.html.erb

.......
    <%= form_tag( '', :method => :get ) do %>
      <% @options = Location.all.map { |a| [ a.name, a.id ] } %>
      <%= select_tag "location_id", options_for_select((@options), params[:location_id]), :onchange => "this.form.submit();", :include_blank => true %> 
    <% end %>
    <%= form_tag( '', :method => :get ) do %>
      <% if(params.has_key?(:location_id)) %>
        <%= hidden_field_tag 'location_id', params[:location_id] %> 
      <% end %>
    <% Category.all.each do |category| %>
    <%= check_box_tag 'category_ids[]', category.id, params[:category_ids].to_s.include?(category.id_to_s) %>
      <%= category.name %>
    <% end %>
    <%= submit_tag 'Filter' %>
    <% end %>
.......

Ответы [ 2 ]

1 голос
/ 25 сентября 2011

У вас есть две формы, я думаю, что это часть вашей проблемы. Всякий раз, когда вы меняете местоположение в первой форме, на ваш контроллер index будет отправлено только действие location_id. Всякий раз, когда вы выбираете категорию и отправляете вторую форму, на ваш контроллер index будет отправлено только действие category_ids.

Используйте одну форму и посмотрите, что произойдет. Это должно, по крайней мере, заставить работать фильтрацию для одной отправки.

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

Посмотрите документацию для options_for_select и check_box_tag, чтобы исправить это.

0 голосов
/ 15 февраля 2014

В моем случае продукт принадлежит_ к: категории и категории has_many: продукты, я изменил category.id на category_id, все работает!

scope :category, lambda { |*category_id| {:include => :categories, :conditions => ["category_id = ?", category_id]} }
...