2016-04-22 3 views
0

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

Мне удалось получить раскрывающееся меню, чтобы показать все категории, используя form_tag, но когда я выбираю категорию, страница индекса не фильтрует, чтобы показывать только эту категорию.

Продукты index.html.erb:

<%= form_tag('products', :remote => true) do %> 
    <%= select_tag "category", options_from_collection_for_select(Category.all, "id", "name"), { :include_blank => true , :class => "product_select"} %> 
    <%= submit_tag 'Filter' %> 
<% end %> 

Продукты контроллер:

def index 
    if Product.all.collect == (params[:category]) 
     @products= Product.send(params[:category]) 
    else 
     @products = Product.order(:title) 
    end 

     respond_to do |format| 
     format.html # index.html.erb 
     format.js # index.js.erb 
     format.json { render json: @products } 
     end 
    end 

application.js:

$(document).ready -> $(".product_select").on "change", -> 
    $.ajax 
     url: "/products" 
     type: "GET" 
     dataType: "script" 
     data: 
     dept_type: $(".product_select").val() 

Заранее спасибо за любую помощь, дайте мне знать, если требуется больше информации.

+0

Я думаю, что ваш код всегда идет на свой контекстуальный ** else ** условие по индексу – Lymuel

+0

вы можете получить некоторые входы от кода OP в этом вопросе: http://stackoverflow.com/questions/36676443/rails-ajax-display-products-by-chosen-filters/36712930 # 36712930 –

ответ

0

Я не уверен, что вы можете вызвать БД из своего вида (я так не думаю). Если вы можете это сделать, вы не должны.

Изменить Category.all

здесь

<%= select_tag "category", options_from_collection_for_select(Category.all, "id", "name"), { :include_blank => true , :class => "product_select"} %> 

в @categories и установить его в контроллере.

что значение

$(".product_select").val() 

Также вы можете многие ко многим отношений для товаров и категорий. Что произойдет, если вы хотите, чтобы один продукт был в двух разных категориях?

0

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

  1. на DIV для страницы индекса продуктов, та часть, которая отображает продукты добавить идентификатор этого DIV (скажем products_div).
    пример кода (_products_list.html.erb)

    <div id="products_div"> 
        <%= @products.each do |product| %> 
        # bla bla bla display product attributes 
    </div> 
    
  2. затем на контроллере для индекса, вы должны обновить его, чтобы использовать данные из запроса Ajax
    пример кода (products_controller)

    if params[:dept_type].present? 
        @products = Product.where(dept_id: params[:dept_type]) 
    else 
        @products = Product.all 
    end 
    
  3. затем на файл представления, products.js.erb, замените содержимое products_div
    образец код (указатель.js.Еврорадио)

    $("#products_div").html("<%= escape_javascript(render partial: 'products_list', locals: { products: @products }) %>"); 
    

код в # 3 заменит содержимое products_div с новыми @products, которые вы отфильтрованы по изменению категории выпадающего списка

+0

Спасибо за ответ. Будет ли код в №3 переходить в файл index.html.erb или я должен создать новый файл с именем products.js.erb в папке просмотра продуктов? – Kris

+0

, если вы ожидаете ответа format.js в своем контроллере, вы должны создать файл .js.erb в представлениях –

Смежные вопросы