[RUBY] [Rails] Tag-Verwaltungsfunktion (unter Verwendung von Acts-as-Taggable-On)

Alt text

Umgebung

[Tagging-Funktion: Registrierung / Löschen / Anzeigen]

1. Edelstein vorstellen

Gemfile


gem 'acts-as-taggable-on', '~> 6.0'

Terminal


% bundle install
         :
#Installieren Sie die Migrationsdatei! Nachricht wird angezeigt, folgen Sie ihr ↓
  % rake acts_as_taggable_on_engine:install:migrations
    #Es werden 6 Migrationsdateien erstellt
    Copied migration 20200905143628_acts_as_taggable_on_migration.acts_as_taggable_on_engine.rb from acts_as_taggable_on_engine
    Copied migration 20200905143629_add_missing_unique_indices.acts_as_taggable_on_engine.rb from acts_as_taggable_on_engine
    Copied migration 20200905143630_add_taggings_counter_cache_to_tags.acts_as_taggable_on_engine.rb from acts_as_taggable_on_engine
    Copied migration 20200905143631_add_missing_taggable_index.acts_as_taggable_on_engine.rb from acts_as_taggable_on_engine
    Copied migration 20200905143632_change_collation_for_tag_names.acts_as_taggable_on_engine.rb from acts_as_taggable_on_engine
    Copied migration 20200905143633_add_missing_indexes_on_taggings.acts_as_taggable_on_engine.rb from acts_as_taggable_on_engine

#Im Fall von mySQL muss ↓ ausgeführt werden, bevor die Migration ausgeführt wird (für die anfängliche Einstellung).
% rake acts_as_taggable_on_engine:tag_names:collate_bin
% rails db:migrate   #Trotzdem tritt ein Fehler auf(Edelsteinwanze?)

rb:xxxxxxxxx_add_missing_unique_indices.acts_as_taggable_on_engine.rb


         :
AddMissingUniqueIndices.class_eval do
  def self.up
    # add_index ActsAsTaggableOn.tags_table, :name, unique: true

    # remove_index ActsAsTaggableOn.taggings_table, :tag_id if index_exists?(ActsAsTaggableOn.taggings_table, :tag_id)
    # remove_index ActsAsTaggableOn.taggings_table, name: 'taggings_taggable_context_idx'
    # add_index ActsAsTaggableOn.taggings_table,
    #           [:tag_id, :taggable_id, :taggable_type, :context, :tagger_id, :tagger_type],
    #           unique: true, name: 'taggings_idx'
  end

  def self.down
    # remove_index ActsAsTaggableOn.tags_table, :name

    # remove_index ActsAsTaggableOn.taggings_table, name: 'taggings_idx'

    # add_index ActsAsTaggableOn.taggings_table, :tag_id unless index_exists?(ActsAsTaggableOn.taggings_table, :tag_id)
    # add_index ActsAsTaggableOn.taggings_table, [:taggable_id, :taggable_type, :context], name: 'taggings_taggable_context_idx'
  end
end

rb:xxxxxxxxxx_add_missing_taggable_index.acts_as_taggable_on_engine.rb


         :
AddMissingTaggableIndex.class_eval do
  def self.up
    # add_index ActsAsTaggableOn.taggings_table, [:taggable_id, :taggable_type, :context], name: 'taggings_taggable_context_idx'
  end

  def self.down
    # remove_index ActsAsTaggableOn.taggings_table, name: 'taggings_taggable_context_idx'
  end
end

** [Tabelle und Spalte erstellt] **

Tags-Tabelle Taggings Tabelle
name(Verlinke den Namen) tag_id(Tags Tabellen-ID)
taggings_count(Anzahl der registrierten Tags) taggable_type
taggable_id
tagger_type
tagger_id
content

Beispiel: fungiert als taggable-on-Methode

[Erwerb und Suche]

Methode etc. Bedeutung
tags_on(:tags) Holen Sie sich eine Liste der Tags für alle Artikel
most_used Tags mit einer großen Anzahl von Registrierungen
least_used Tags mit einer kleinen Anzahl von Registrierungen
most_used(10) Erhalten von Tags mit einer großen Anzahl von Registrierungen. Der Standardwert ist 20
least_used(10) Erhalten von Tags mit einer kleinen Anzahl von Registrierungen. Der Standardwert ist 20
tag_counts Daten aller Tags
named("Verlinke den Namen") Perfekte Übereinstimmung
named_any(["Tag-Name 1", "Tag-Name 2",..]) Perfekte Übereinstimmung(and)
named_like("Verlinke den Namen") Teilweise Übereinstimmung
named_like_any(["Tag-Name 1", "Tag-Name 2",..]) Teilweise Übereinstimmung(or)

Beispiel)Tag-Suche


class User < ActiveRecord::Base
  acts_as_taggable_on :tags, :skills
  scope :by_join_date, order("created_at DESC")
end
  User.tagged_with(params[:tag])       #Abrufen von Benutzerdaten, die Tags zugeordnet sind
  User.tagged_with("Tag 1")[0].id       # 1
  User.tagged_with("Tag 1,Tag 2")[0].id #Es kann eine durch Kommas getrennte Zeichenfolge anstelle eines Arrays sein.
  #Schließen Sie es ein?
  User.tagged_with("Tag 1").by_join_date
  User.tagged_with("Tag 1").by_join_date.paginate(page: params[:page], per_page: 20)
  #Perfekte Übereinstimmung(UND suchen)
  User.tagged_with(["Tag 1", "Tag 2"], match_all: true)
  #Zustandsübereinstimmung(ODER suchen)
  User.tagged_with(["Tag 1", "Tag 2"], any: true)
  #Ausschluss(Suchen Sie nach Dingen, die nicht enthalten sind)
  User.tagged_with(["Tag 1", "Tag 2"], exclude: true)

[Registrierung oder Löschung]

Methode etc. Bedeutung
tag_list.add("Tag 1", "Tag 2", ..) hinzufügen
tag_list = 'Tag 1,Tag 2, ..' Überschreiben
tag_list.remove("Tag 1", "Tag 2", ..) Löschen
save sparen([id: 1, name: "Tag 1", taggings_count: 1],[id: 2, name: "Tag 2", taggings_count: 1])

2. Modell (Assoziation)

Postmodell


acts_as_taggable   # acts_as_taggable_on :Weglassen von Tags

#drei)Mehrfacheinstellungen sind möglich ↓
acts_as_taggable_on :skills, :interests  # @post.skill_Sie können Liste usw. verwenden.

3. Controller

Beiträge Controller


def index
  @posts = Post.all
  @tags = Post.tag_counts_on(:tags).most_used(20)    #Anzeige der Tag-Liste
end

def show
  @post = Post.find(params[:id])
  @tags = @post.tag_counts_on(:tags)    #Anzeige von Tags, die mit Posts verknüpft sind
end
      :
private
      :
def post_params
  params.require(:post).permit(:title, :content, :tag_list)
end

4. Anzeigen

4-1. Tagging-Formular

Richten Sie ein Formular zum Markieren auf der Beitragsseite ein(haml)


- form_for @post do |f|
    :
  = f.label :tag_list
  = f.text_field :tag_list, value: @post.tag_list.join(',')

-#drei)Wenn Sie mit dem Tag das Kontrollkästchen aktivieren möchten
- @tags.each do |tag|
  = f.check_box :tag_list, { multiple: true }, "#{tag.name}", nil
  = f.label " #{tag.name}(#{tag.taggings_count})"

4-2. Tag-Anzeige

--Die im Modell hinzugefügten : tags sind mit dem Post-Modell verknüpft. --Tag_list ist ein Array, also holen Sie es sich mit jeder Anweisung. Alt text

Anzeige von Tags(haml)


- if @tags.present?
  - @tags.each do |tag|  #Erhalten Sie 20 in der Reihenfolge der Anzahl der Registrierungen beim Controller(@tags)
    = link_to "#{tag.name}(#{tag.taggings_count})", tags_path(tag.name)
- else
 %p Es sind keine Tags registriert

[Tag-Suche]

--Klicken Sie auf das Tag (Link), um eine Liste verwandter Beiträge auf der Indexseite für Beiträge anzuzeigen.

Beiträge Controller


def index
       :
  @tags = Post.tag_counts_on(:tags).order('count DESC')     #Alle Tags(Ruft die Tag-Spalte vom Post-Modell in absteigender Reihenfolge ab)
  if @tag = params[:tag]   #Für die Tag-Suche
    @post = Post.tagged_with(params[:tag])   #Mit Tags verknüpfte Beiträge
  end
end

--tagged_with ("tag name"): Eine Methode zum Eingrenzen der Suche. Holen Sie sich die angeklickten Tag-Informationen und suchen Sie nach tagged_with ("Tag-Name"). Sie können Beiträge mit demselben Tag erhalten.

Tag mit Link (haml)


- @tags.each do |tag|
  = link_to "#{tag.name}(#{tag.taggings_count})", posts_path(tag: tag.name)

Anzeige der mit dem Tag verknüpften Beitragsliste (haml)


- if @post.present?
  %h1 #{@tag}Beiträge im Zusammenhang mit
  - @post.each do |post|
    = post.user.name
    = post.name

[Bereiten Sie die Benutzeroberfläche vor (Tag-it)]

--Tag-it ist ein jQuery-Plug-In, das eine Tagging-Benutzeroberfläche bietet.

1. Einleitung

  1. Klicken Sie unter tag-it GitHub auf Clone Download ZIP.
  2. Entpacken Sie die Datei und speichern Sie sie in den Verzeichnissen JS und CSS. ** ・ ** jquery.tagit.css, tagit.ui-zendesk.css im CSS-Ordner → App / Assets / Stylesheets ** ・ ** tag-it.js, tag-it.min.js im Ordner js → Assets / Javascripts
  3. Juwel eingeführt.

Gemfile


gem 'jquery-ui-rails'  # Tag-Es verwendet die jQuery-Benutzeroberfläche

2. Einstellungen

--Tag-it, Einstellungen zum Laden der jQuery-Benutzeroberfläche.

application.js


//= require jquery
//= require jquery_ujs
//= require jquery-ui
//= require tag-it
//= require_tree .

// turbolinks(Die Rolle der Beschleunigung des Seitenladens)Gelöscht, da jQuery nur ausgelöst wird, wenn die Seite neu geladen wird(Invalidierung)。

application.scss


@import "reset";
@import "font-awesome-sprockets";
@import "font-awesome";
@import "jquery.tagit";       //Achten Sie auf die Reihenfolge der Beschreibung
@import "tagit.ui-zendesk";   //Wenn Sie dies später nicht schreiben, wird die Tag-Löschung (x) nicht angezeigt
        :

3. Laden Sie tag-it (jQuery)

--Seite aktualisieren löst Tag-it-Ereignis aus. --Ändern Sie die Anzeige des Platzhalters für jeden Eingang ↓ ↓ Alt text

tag-Laden Sie es (jQuery)


//Tag auf Seite aktualisieren-es entzündet sich
$(document).ready(function() {
  $(".tag_form").tagit({  //Angegebener Selektor(Diesmal,:tag_Listentext_field )Zu markieren-Reflektiere es
    tagLimit:10,         //Maximale Anzahl von Tags
    singleField: true,   //Kennzeichnen Sie die Einzigartigkeit
 // availableTags: ['ruby', 'rails', ..]Sie können eine Liste festlegen, die automatisch vervollständigt wird(* Anordnung ist ok).. Übergeben Sie diesmal den Wert von DB per Ajax-Kommunikation(Siehe unten)。
  });
  let tag_count = 10 - $(".tagit-choice").length    //Registrierte Tags zählen
  $(".ui-widget-content.ui-autocomplete-input").attr(
    'placeholder','nach' + tag_count + 'Sie können sich einzeln registrieren');
})

//Ändern Sie den Platzhalter durch Eingabe von Tags
$(document).on("keyup", '.tagit', function() {
  let tag_count = 10 - $(".tagit-choice").length    //Es ist dasselbe wie ↑, daher ist es besser, es zusammenzufassen.
  $(".ui-widget-content.ui-autocomplete-input").attr(
  'placeholder','nach' + tag_count + 'Sie können sich einzeln registrieren');
});

  //drei:So schreiben Sie Platzhalter neu
    $(".input").attr('placeholder','Umgeschriebener Text');
  //drei:So löschen Sie Platzhalter
    $(".input").removeAttr('placeholder');

--Wenn das Ereignis mit $ (Selektor) .tagit () (jQuery) ausgelöst wird, auf haml, ** ・ ** Das Namensattribut: post [tag_list] wird dem Tag-Eingabeformular (text_field) hinzugefügt (* post_params (controller) erlaubt **: tag_list **, sodass Sie Tags registrieren können. ). Der ID-Name und der Klassenname werden ebenfalls hinzugefügt. ** ・ ** ul und li werden im Eingabeformular hinzugefügt.

Änderungen im Tag-Eingabeformular aufgrund des Auslösens des Tagit-Ereignisses(haml)


.input_form
  = f.text_field :tag_list, value: @post.tag_list.join(","), class: "tag_form tagit-hidden-field" name: "post[tag_list]" id: "post_tag_list"  #Der Klassenname, der Name und der ID-Name werden im Tagit-Ereignis hinzugefügt.
  -#Hinzugefügt im Tagit-Ereignis ↓ ↓
  %ul.tagit.ui-widget.ui-widget-content.ui-corner-all
    %li.tagit-new
      = f.text_field, class: "ui-widget-content ui-autocomplete-input", autocomplete: "off", placeholder: "Sie können 10 weitere registrieren"                  # autocomplete="off"Deaktivieren Sie das automatische Ausfüllen

4. Tag inkrementelle Suche

4-1. Routing

routes.rb


  resources :posts, expect: [:index] do
    get 'get_tag_search', on: :collection, defaults: { format: 'json' }
    get 'get_tag_search', on: :member, defaults: { format: 'json' }
  end

4-2. Controller

Beiträge Controller


def get_tag_search
  @tags = Post.tag_counts_on(:tags).where('name LIKE(?)', "%#{params[:key]}%")
end

4-3. jbuilder

rb:views/posts/get_tag_search.json.jbuilder


json.array! @tags do |tag|
  json.name tag.name
end
  # [{name: "Tag-Name 1"}, {name: "Tag-Name 2"}, ..]Ich verstehe es mit der Art von

4-4. jQuery

jQuery(Ajax-Kommunikationsteil)


$(document).on("keyup", '.tagit', function() {
           :
  //Holen Sie sich eine Liste der Tags mit Ajax
  let input = $(".ui-widget-content.ui-autocomplete-input").val();  //Speichern Sie den Eingabewert in der variablen Eingabe
  $.ajax({
    type: 'GET',
    url: 'get_tag_search',    //Die im Routing festgelegte URL
    data: { key: input },     //Eingegebener Wert:Übergeben Sie es als Schlüssel an die Steuerung
    dataType: 'json'
  })

  .done(function(data){
    if(input.length) {               //Nur wenn ein Eingabewert vorhanden ist
      let tag_list = [];             //Bereiten Sie ein leeres Array vor
      data.forEach(function(tag) {   //Speichern Sie den Namen der erfassten Daten in einem Array
        tag_list.push(tag.name);     //Fügen Sie eins nach dem anderen hinzu. Etikett_list = ["Tag-Name 1", "Tag-Name 2", ..]
      });
      $(".tag_form").tagit({
        availableTags: tag_list
      });
    }
  })
});

Recommended Posts

[Rails] Tag-Verwaltungsfunktion (unter Verwendung von Acts-as-Taggable-On)
[Rails] Tag-Ranking-Funktion
[Rails] Implementierung der Tag-Funktion mit Acts-as-Taggable-On und der Funktion zur Vervollständigung der Tag-Eingabe mit Tag-It
Tag-Funktion zu Rails hinzufügen. Verwenden Sie Acts-as-Taggable-On
Tag-Funktion mit Acts-as-Taggable-On für Devise My Memo
Erstellen Sie eine Filterfunktion mit Acts-as-Taggable-On
[Schienen] Kategoriefunktion
Schienen folgen der Funktion
Rails linked_to tag
[Rails] Benachrichtigungsfunktion
[Rails] Implementierung der Suchfunktion mit Gem's Ransack
Erstellen Sie die Authentifizierungsfunktion in der Rails-Anwendung mit devise
[Rails] Implementierung der Bildvergrößerungsfunktion mit Lightbox2
Implementieren Sie die Sternebewertungsfunktion mit Raty in Rails 6
[Rails] Zeitplanverwaltung mit der Implementierung von Full Calendar Yesterday
[Rails] Ich habe eine Entwurfsfunktion mit enum erstellt
[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 "Edit Form Edition"
Ruby on Rails Einstellung der automatischen E-Mail-Sendefunktion (über Google Mail)
[Rails] Implementierung einer mehrschichtigen Kategoriefunktion unter Verwendung der Abstammung "Erstellungsformular"
[Rails] Implementiere die Event-End-Funktion (logisches Löschen) mit Paranoia (Gem)
[Rails] Implementieren Sie die Funktion zur Beantragung / Genehmigung einer Community-Mitgliedschaft mithilfe von Many-to-Many-Zuordnungen
Implementieren Sie die Anwendungsfunktion in Rails
Implementierung der Fuzzy-Suchfunktion für Schienen
[Schienen] Implementieren Sie die Benutzersuchfunktion
SNS-Authentifizierung mit Rails Google
Japanisieren Sie mit i18n mit Rails
[Rails] Japanische Lokalisierung mit Rails-i18n
[Rails] Implementierung der Kategoriefunktion
Schienen ~ Die Nachrichtenfunktion verstehen ~
[Rails] Testcode mit Rspec
Implementieren Sie die Kategoriefunktion mithilfe von Vorfahren
[Rails] EC-Site-Cart-Funktion
Fehler bei der Verwendung von Schienen Capybara
[Rails] Implementierung der Tutorial-Funktion
[Rails] Versuchen Sie, Faradays Middleware zu verwenden
Detaillierte Tipps zur Verwendung von Rails
[Rails] Implementieren Sie die Image-Posting-Funktion
[Rails] Implementierung einer ähnlichen Funktion