[JAVA] [Rails] Implementierung einer mehrschichtigen Kategoriefunktion unter Verwendung der Abstammung "Ich habe versucht, ein Fenster mit Bootstrap 3 zu erstellen"

Ziel

ezgif.com-video-to-gif.gif

Entwicklungsumgebung

・ Ruby: 2.5.7 Schienen: 5.2.4 ・ Vagrant: 2.2.7 -VirtualBox: 6.1 ・ Betriebssystem: macOS Catalina

Annahme

Folgendes wurde implementiert.

Schlanke EinführungEinführung von Bootstrap 3Einführung von Font Awesome

1. Bearbeiten Sie den Controller

homes_controller.rb


#Nachtrag
def category_window
  @children = Category.find(params[:parent_id]).children
end

[Erläuterung]

(1) Extrahieren Sie die untergeordneten Kategorien der Kategorien, die den von Ajax Communication gesendeten Parametern entsprechen, und weisen Sie sie den Instanzvariablen zu.

@children = Category.find(params[:parent_id]).children

2. Erstellen / bearbeiten Sie die Datei "json.jbuilder"

Terminal


$ touch app/views/homes/category_window.json.jbuilder

ruby:category_window.json.jbuilder


json.array! @children do |children|
  json.id children.id
  json.name children.name
end

[Erläuterung]

(1) Wiederholen Sie die Datensätze, die mit der Aktion "get_category_children" extrahiert wurden, um ein Array zu erstellen.

json.array! @children do |children|

(2) Speichern Sie jede ID und jeden Namen in dem von erstellten Array.

json.id children.id
json.name children.name

** ◎ Rückgabewert, wenn sich die Maus in der übergeordneten Kategorie (Unternehmen) befindet **

[
  {
    "id": 2, 
    "name": "Finanzen"
  },
  {
    "id": 6, 
    "name": "Wirtschaft"
  },
  {
    "id": 9, 
    "name": "Management"
  },
  {
    "id": 13, 
    "name": "Marketing"
  },
]

** ◎ Rückgabewert, wenn sich die Maus in der untergeordneten Kategorie befindet (Finanzen) **

[
  {
    "id": 3, 
    "name": "Lager"
  },
  {
    "id": 4, 
    "name": "Austausch-"
  },
  {
    "id": 5, 
    "name": "MwSt"
  },
]

3. Routing hinzufügen

routes.rb


#Nachtrag
get 'get_category/new', to: 'homes#category_window', defaults: { format: 'json' }

4. Ansicht bearbeiten

slim:application.html.slim


body
  header
    nav.navbar.navbar-default.navbar-fixed-top
      .container-fluid
        ul.nav.navbar-nav.navbar-right
          li.dropdown role='presentation'
            a.dropdown-toggle data-toggle='dropdown' href='#' role='button' aria-expanded='false'
              i.fas.fa-list-ul
              span
                |Suche nach Kategorie
              span.caret
            ul.dropdown-menu role='menu'
              li role='presentation'
                - Category.where(ancestry: nil).each do |parent|
                  = link_to parent.name, root_path, id: "#{parent.id}", class: 'parent-category'
              br
              li role='presentation' class='children-list'
              br
              li role='presentation' class='grandchildren-list'

[Erläuterung]

** * Ich werde das Schreiben von Bootstrap weglassen. ** ** **

(1) Der Wert der Abstammung ist "Null", dh alle übergeordneten Kategorien werden extrahiert und im Pulldown-Menü angezeigt.

- Category.where(ancestry: nil).each do |parent|
  = link_to parent.name, root_path, id: "#{parent.id}", class: 'parent-category'

(2) Bereiten Sie einen Ort für die Anzeige der untergeordneten Kategorie vor.

li role='presentation' class='children-list'

③ Bereiten Sie einen Ort für die Anzeige der Enkelkategorie vor.

li role='presentation' class='grandchildren-list'

5. Erstellen / bearbeiten Sie eine JavaScript-Datei

Terminal


$ touch app/assets/javascripts/category_window.js

category_window.js


$(function() {
  function buildChildHTML(children) {
    let html = `
      <a class="children-category" id="${children.id}" href="/">
        ${children.name}
      </a>
    `;
    return html;
  }

  $('.parent-category').on('mouseover', function() {
    let id = this.id;
    $('.children-category').remove();
    $('.grandchildren-category').remove();
    $.ajax({
      type: 'GET',
      url: '/get_category/new',
      data: {
        parent_id: id,
      },
      dataType: 'json',
    }).done(function(children) {
      children.forEach(function(child) {
        let html = buildChildHTML(child);
        $('.children-list').append(html);
      });
    });
  });

  function buildGrandChildHTML(children) {
    let html = `
      <a class="grandchildren-category" id="${children.id}" href="/">
        ${children.name}
      </a>
    `;
    return html;
  }

  $(document).on('mouseover', '.children-category', function() {
    let id = this.id;
    $.ajax({
      type: 'GET',
      url: '/get_category/new',
      data: {
        parent_id: id,
      },
      dataType: 'json',
    }).done(function(children) {
      children.forEach(function(child) {
        let html = buildGrandChildHTML(child);
        $('.grandchildren-list').append(html);
      });
      $(document).on('mouseover', '.children-category', function() {
        $('.grandchildren-category').remove();
      });
    });
  });
});

[Erläuterung]

① Erstellen Sie HTML für die untergeordnete Kategorie.

function buildChildHTML(children) {
  let html = `
    <a class="children-category" id="${children.id}" href="/">
      ${children.name}
    </a>
  `;
  return html;
}

(2) Ändern Sie den Anzeigeinhalt der untergeordneten Kategorie in Abhängigkeit von der übergeordneten Kategorie, in der sich die Maus befindet.

  $('.parent-category').on('mouseover', function() {
    let id = this.id;
    $('.children-category').remove();
    $('.grandchildren-category').remove();
    $.ajax({
      type: 'GET',
      url: '/get_category/new',
      data: {
        parent_id: id,
      },
      dataType: 'json',
    }).done(function(children) {
      children.forEach(function(child) {
        let html = buildChildHTML(child);
        $('.children-list').append(html);
      });
    });
  });

** ◎ Erstellen Sie ein Ereignis, das ausgelöst wird, wenn die Maus auf die übergeordnete Kategorie gesetzt wird. ** ** **

$('.parent-category').on('mouseover', function() {});

** ◎ Weisen Sie der Variablen die von category_window.json.jbuilder gesendete ID zu. ** ** **

let id = this.id;

** ◎ Löschen Sie vorerst die untergeordnete Kategorie und darunter. ** ** **

$('.children-category').remove();
$('.grandchildren-category').remove();

** ◎ Legen Sie die zuvor im Parameter (parent_id) erstellte Variable fest und führen Sie die Aktion category_window asynchron aus. ** ** **

  $.ajax({
    type: 'GET',
    url: '/get_category/new',
    data: {
      parent_id: id,
    },
    dataType: 'json',
  })

** ◎ Wenn die Ajax-Kommunikation erfolgreich ist, erstellen Sie HTML für die entsprechende untergeordnete Kategorie und zeigen Sie es an. ** ** **

.done(function(children) {
  children.forEach(function(child) {
    var html = buildChildHTML(child);
    $('.children-list').append(html);
  });
});

③ Erstellen Sie HTML für die Enkelkategorie.

function buildGrandChildHTML(children) {
  var html = `
    <a class="grandchildren-category" id="${children.id}" href="/">
      ${children.name}
    </a>
  `;
  return html;
}

④ Ändern Sie den Anzeigeinhalt der Enkelkategorie in Abhängigkeit von der untergeordneten Kategorie, in der sich die Maus befindet. (Da es fast dasselbe ist wie "③", wird die Erklärung weggelassen)

$(document).on('mouseover', '.children-category', function() {
  var id = this.id;
  $.ajax({
    type: 'GET',
    url: '/get_category/new',
    data: {
      parent_id: id,
    },
    dataType: 'json',
  }).done(function(children) {
    children.forEach(function(child) {
      var html = buildGrandChildHTML(child);
      $('.grandchildren-list').append(html);
    });
    $(document).on('mouseover', '.children-category', function() {
      $('.grandchildren-category').remove();
    });
  });
});

Hinweis

Wenn Sie "Turbolinks" nicht deaktivieren, funktioniert das Pulldown-Menü nicht asynchron. Deaktivieren Sie es daher unbedingt.

So deaktivieren Sie Turbolinks

Recommended Posts

[Rails] Implementierung einer mehrschichtigen Kategoriefunktion unter Verwendung der Abstammung "Ich habe versucht, ein Fenster mit Bootstrap 3 zu erstellen"
[Rails] Implementierung einer mehrschichtigen Kategoriefunktion unter Verwendung der Abstammung "Vorbereitung"
[Rails] Implementierung einer mehrschichtigen Kategoriefunktion unter Verwendung der "Seed Edition" der Vorfahren
[Rails] Implementierung einer mehrschichtigen Kategoriefunktion unter Verwendung der Abstammung "Erstellungsformular"
Ich habe versucht, mit Rails eine Gruppenfunktion (Bulletin Board) zu erstellen
Ich habe versucht, eine Nachrichtenfunktion der Rails Tutorial-Erweiterung (Teil 1) zu erstellen: Erstellen Sie ein Modell
Ich habe versucht, eine Antwortfunktion für die Rails Tutorial-Erweiterung (Teil 3) zu erstellen: Ein Missverständnis der Spezifikationen wurde behoben
Ich habe versucht, eine Nachrichtenfunktion für die Erweiterung Rails Tutorial (Teil 2) zu erstellen: Erstellen Sie einen Bildschirm zum Anzeigen
Ich habe versucht, mit HCE-F von Android eine Funktion zu implementieren, die Felica Lite entspricht
Rails6 Ich möchte ein Array von Werten mit einem Kontrollkästchen erstellen
Ich habe versucht, eine Anmeldefunktion mit Java zu erstellen
[Rails] Implementierung der Kategoriefunktion
[Rails] Ich habe versucht, eine Mini-App mit FullCalendar zu erstellen
Ich möchte eine Funktion mit Kotlin und Java erstellen!
Ich habe einen RESAS-API-Client in Java erstellt
Implementierung der Funktionsfunktion [Rails] gem ancestry category
Ich habe versucht, die Ajax-Verarbeitung der ähnlichen Funktion in Rails zu implementieren
Ich möchte eine Browsing-Funktion mit Ruby on Rails hinzufügen
Ich habe versucht, die Bildvorschau mit Rails / jQuery zu implementieren
[Unity] Ich habe mit NWPathMonitor ein natives Plug-In UniNWPathMonitor erstellt
[Rails] Implementierung der Couponfunktion (mit automatischer Löschfunktion mittels Stapelverarbeitung)
Ich habe versucht, eine einfache Anwendung mit Dockder + Rails Scaffold zu erstellen
Ich habe eine App für maschinelles Lernen mit Dash (+ Docker) Teil 2 ~ Grundlegende Schreibweise für Dash ~ erstellt
Erstellen Sie trotzdem eine Anmeldefunktion mit Rails
Ich habe versucht, ein übergeordnetes Wertklasseobjekt in Ruby zu erstellen
Ich habe versucht, eine einfache Gesichtserkennungs-Android-Anwendung mit OpenCV zu erstellen
[iOS] Ich habe versucht, mit Swift eine insta-ähnliche Verarbeitungsanwendung zu erstellen
[Rails] Ich werde die Prozedur zum Implementieren der Follow-Funktion mit form_with erklären.
Ich habe versucht, eine Web-API zu erstellen, die mit Quarkus eine Verbindung zur Datenbank herstellt
Ich habe versucht, mit AI "A3RT" eine Talk-App in Java zu erstellen.
Ich habe versucht, ein Beispielprogramm mit dem Problem des Datenbankspezialisten für domänengesteuertes Design zu erstellen
[Rails] Implementierung der Suchfunktion mit Gem's Ransack
Ich habe versucht, eine Standardauthentifizierung mit Java durchzuführen
[Rails] Implementierung der Bildvergrößerungsfunktion mit Lightbox2
[Rails] Ich habe eine Entwurfsfunktion mit enum erstellt
Lassen Sie uns eine Suchfunktion mit Rails (Ransack) machen
[Rails] Implementierung einer Bild-Diashow mit Bootstrap 3
Ich habe versucht, einen Server mit Netty zu implementieren
Ich habe versucht, den Block mit Java zu brechen (1)
Ich habe eine App für maschinelles Lernen mit Dash (+ Docker) Teil 3 ~ Übung ~ erstellt
Ich möchte in der Lage sein, Dateien mit refile mit administrate [rails6] zu lesen.
Ich habe versucht, mit Javafx ein einfaches Spiel zu machen ① "Lass uns Glücksspiel finden" (unvollendet)
[Java] Ich habe versucht, über den Verbindungspool eine Verbindung mit Servlet (Tomcat) & MySQL & Java herzustellen
[Android] Ich habe mit ListView + Bottom Sheet einen Materiallistenbildschirm erstellt
Ich habe versucht, eine Webanwendung voller Fehler mit Spring Boot zu klonen
Ich habe versucht, mit Java und Spring eine Funktion / einen Bildschirm für den Administrator einer Einkaufsseite zu erstellen
Ich habe versucht, ein einfaches Spiel mit Javafx zu machen ① "Lass uns Glücksspiel finden" (unvollendete Version ②)
Ich habe versucht, die Server-Push-Funktion von Servlet 4.0 zu verwenden
[Rails] Implementierung der Drag & Drop-Funktion (mit Wirkung)
Ich möchte eine Funktion in der Rails Console definieren
Ich habe versucht, den Mechanismus von Emscripten mit einem deutschen Löser zu untersuchen
Ich habe versucht, ein Tool zum Vergleichen von Amazon-Produktpreisen auf der ganzen Welt mit Java, der Amazon Product Advertising API und der Currency API (29.01.2017) zu erstellen.
Ich habe versucht, die Beispielanwendung gemäß der Idee des Buches "Micro Service Architecture" in einen Mikrodienst zu verwandeln.
Ich habe versucht, eine Java EE-Anwendung mit OpenShift zu modernisieren.