Rails ancestry gem + Render и выберите категорию / подкатегорию в новой форме - PullRequest
0 голосов
/ 21 декабря 2018

У меня есть Rails 5.2.2, и я пытаюсь реализовать драгоценный камень предков.

Итак, что я хочу:

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

Автомобиль -> Тормоза -> Тормозные колодки

Поэтому, выбрав Тормозные колодки, он может создать предложение.

Что у меня есть:

#category.rb
class Category < ApplicationRecord
  has_ancestry
  has_many :parts
end

-

#part.rb
class Part < ApplicationRecord
  belongs_to :category
end

На данный момент я уже создал один в консоли, чтобы он работал: Например,

car = Category.create!(name: "Car")
brakes = Category.create!(name: "Brakes", parent: car)
brake_pads = Category.create!(name: "Brake Pads", parent: brakes)

Я уже также запускаю миграцию rails g migration add_category_to_parts category:references.

И мой взгляд:

#views/parts/new.html.haml
.container
  %h2.center Create offer
  = simple_form_for(@part, html: {class: "form-group" }) do |f|
    .form-group.col-md-8.col-md-offset-2.well
      = f.input :title
      = f.input :make_name, label: "Make"
      = f.input :code, label: 'Part number'
      = f.association :condition, label_method: :name, prompt: "-"
      = f.input :description
      .form-actions
        = f.button :submit, class: "btn btn-primary btn-dark-blue"

Вопрос: как я могу отобразить категории / подкатегории в моих представлениях-> части ->Форма new.html.haml с 3 раскрывающимися списками (по одному для каждой подкатегории, поскольку у меня будет много категорий / подкатегорий), чтобы пользователь мог выбрать их и затем создать предложение?

1 Ответ

0 голосов
/ 21 декабря 2018

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

# config/routes.rb
resources :categories, only: [] do
  get :select_item, on: :collection
end

# app/assets/javascripts/application.js
$('#first-dropdown').on('change', function() {
  $.ajax({
    url: 'categories/select_item?category_id=' + $(this).val(),
    dataType: 'json',
    success: function(data) {
      var childElement = $('#second-dropdown');
      childElement.html('');
      data.forEach(function(v) {
        var id = v.id;
        var name = v.name;
        childElement.append('<option value="' + id + '">' + name + '</option>');
      });
    }
  });
});

# app/controllers/categories_controller.rb
Class CategoriesController < ApplicationController
  def select_item
    category = @category.find params[:category_id]
    render json: category.children
  end
end 

# app/inputs/fake_select_input.rb
class FakeSelectInput < SimpleForm::Inputs::CollectionSelectInput
  def input(wrapper_options = nil)
    label_method, value_method = detect_collection_methods

    merged_input_options = merge_wrapper_options(input_html_options, wrapper_options).merge(input_options.slice(:multiple, :include_blank, :disabled, :prompt))

    template.select_tag(
      attribute_name, 
      template.options_from_collection_for_select(collection, value_method, label_method, selected: input_options[:selected], disabled: input_options[:disabled]), 
      merged_input_options
    )
  end
end

# views/parts/new.html.haml
.form-group.col-md-8.col-md-offset-2.well
  = f.input :title
  = f.input :make_name, label: "Make"
  = f.input :code, label: 'Part number'
  = f.association :condition, label_method: :name, prompt: "-"
  = f.input :description
  = f.input :parent_category_id, as: :fake_select, collection: Category.roots, input_html: { id: 'first-dropdown' }
  = f.input category_id, collection: [], input_html: { id: 'second-dropdown' }
  .form-actions
    = f.button :submit, class: "btn btn-primary btn-dark-blue"

Так как simple_form использует модель, вам нужно создать пользовательский ввод для полей, не являющихся моделями (родительскийкатегории).Вам нужно сохранить только один category_id в @part, родительские категории всегда можно извлечь из него.Если вам нужно больше, чем 2 раскрывающихся списка, просто добавьте еще одну функцию или (лучше) измените ее, чтобы вы могли передать зависимый раскрывающийся список в качестве параметра

...