[RUBY] Ajoutez une fonction de balise aux rails. Utilisez actes-comme-taggable-on

Aperçu

J'ai utilisé gem agit-as-taggable-on dans Rails pour ajouter une fonctionnalité de balise. La fonction que j'ai ajoutée est une fonction de balise qui vous permet de préparer des balises existantes (dans le fichier de départ) à partir de nouveaux articles et d'en sélectionner plusieurs. L'image ci-dessous. スクリーンショット 2020-07-16 22.58.40.png

environnement

Ruby 2.5.7 Rails 5.2.4.2 Utiliser le design Bootstrap

la mise en oeuvre

① Installation

Gemfile.


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

Terminal.


$ bundle install

② Créer un tableau

Terminal.


$ rails acts_as_taggable_on_engine:install:migrations

$ rails db:migrate

③ Ajouté au modèle et au contrôleur

app/models/style.rb


class Style < ApplicationRecord
    acts_as_taggable  #ajouter à
end

Dans l'index, la liste des balises et ce qui est marqué lorsque la balise est enfoncée sont affichées.

app/controllers/styles_controller.rb


def index
    @tags = ActsAsTaggableOn::Tag.all
    #Liste des balises
    if params[:tag]
      @styles = Style.tagged_with(params[:tag])
      #Lors de la recherche d'un tag, celui dont le tag a été supprimé s'affiche.
    else
      @styles = Style.all
    end

def new
    @style = Style.new
    @tags = ActsAsTaggableOn::Tag.all
end

def show
    @style = Style.find(params[:id])
end

def create
    @style = Style.new(style_params)
    @style.user_id = current_user.id
    if @style.save
      flash[:notice] = "J'ai enregistré le style"
      redirect_to style_path(@style.id)
    else
      @tags = ActsAsTaggableOn::Tag.all
      render :new
   end
end
#Puisque la mise à jour et la destruction ont la même forme, elles sont omises.

private

def style_params
      params.require(:style).permit(:name, :user_id, :image, tag_list: [])
      #  tag_list: []Ajoutée
end

end

④ Ajouter au fichier de départ Cette fois, nous allons préparer une balise existante, utilisez donc le fichier de départ.

db/seeds.rb


#Tagué liage(%w()Décrit dans)
array = %w(Mode élégant naturel Mash pour femmes Mash Short Bob Inner Winding Bob Couche courte Couche longue Tonte des femmes Coupe pour hommes Coupe pour hommes Deux blocs pour femmes Deux blocs Mohican Business Girls Garçons étudiants Mme Balayages Mesh Gradient Color Celebrity Mariage tressé Cérémonie Fête Maquillage Décontracté Maquillage Mignon Mode Maquillage Maquillage Naturel Maquillage Élégant Cérémonie des Adultes Loup des Femmes Loup Dégradé Bob Extérieur Miel Bob Avant Bas Cheveux Gris Sportifs Couleur Intérieure Couleur Boucle D'oreille Couleur de Boucle D'oreille Perm des Femmes Perm Femmes Perm Hommes Mesh Couleur des Hommes)
array.each{ |tag|
  tag_list = ActsAsTaggableOn::Tag.new
  tag_list.name = tag
  tag_list.save
}

Terminal.


$ rails db:seed

⑤ Décrivez en vue


<div class="col-xs-12">
   <% @tags.each do |tag| %>
      <%= link_to "#{tag.name}(#{tag.taggings_count})", tag_path(tag.name), class: "label label-default" %>
   <% end %>
</div>
<%= form_for @style do |f| %>
  <div class="col-xs-12">
・ ・ ・ ・ ・ ・ ・
    <label class="col-sm-12">marque</label>
      <div class="col-sm-12">
        <% @tags.each do |tag| %>
          <%= f.check_box :tag_list, { multiple: true }, "#{tag.name}", nil %>
          <%= f.label " #{tag.name}(#{tag.taggings_count})", class: "label label-default" %>
        <% end %>
      </div>

      <div class="col-sm-12 text-right">
        <%= f.submit "Créer un nouveau", class: "btn btn-danger" %>
      </div>
   </div>
  </div>
<% end %>
<label class="col-sm-12 my-top">
   <%= raw(@style.tag_list.map { |t| link_to t, tag_path(t), class: "label label-default" }.join(' ')) %>
</label>

Ce qui précède ressemblera à ce qui suit.

L'index tagged_with (params [: tag]) réduit les balises. Cliquez sur la balise pour afficher les données liées à la balise. Dans # {tag.name}, le nom du tag est affiché. # {tag.taggings_count} indique le nombre de balises enregistrées. Ceci termine la mise en œuvre.

Supplément

Lors du déploiement en production, j'ai eu une erreur avec actes-comme-taggable-on. Si vous obtenez une erreur, veuillez vous y référer. J'ai besoin de modifier la table des balises

db/migrate/・ ・ ・_acts_as_taggable_on_migration.acts_as_taggable_on_engine.rb


t.references :tag, foreign_key: { to_table: ActsAsTaggableOn.tags_table }

Malgré le réglage de la clé externe ci-dessus

db/migrate/・ ・ ・ ・_add_missing_unique_indices.acts_as_taggable_on_engine.rb


remove_index ActsAsTaggableOn.taggings_table, :tag_id if index_exists?(ActsAsTaggableOn.taggings_table, :tag_id)

Il semble que vous essayez de supprimer l'index sans supprimer la clé externe.

Cela a donc fonctionné lorsque je l'ai fait comme suit.

db/migrate/・ ・ ・ ・_add_missing_unique_indices.acts_as_taggable_on_engine.rb


# This migration comes from acts_as_taggable_on_engine (originally 2)
if ActiveRecord.gem_version >= Gem::Version.new('5.0')
  class AddMissingUniqueIndices < ActiveRecord::Migration[4.2]; end
else
  class AddMissingUniqueIndices < ActiveRecord::Migration; end
end
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)
    #Commentez ce qui précède
    if index_exists?(ActsAsTaggableOn.taggings_table, :tag_id) #ajouter à
      remove_foreign_key :taggings, :tags                      #ajouter à
      remove_index ActsAsTaggableOn.taggings_table, :tag_id    #ajouter à
    end
    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

Ici, j'ai fait référence à ce qui suit. https://teratail.com/questions/224720

Dans l'environnement de développement, j'ai eu une erreur avec gem où il n'y avait pas de problème, donc j'étais impatient ... Je suis heureux que vous puissiez l'utiliser comme référence.

Recommended Posts

Ajoutez une fonction de balise aux rails. Utilisez actes-comme-taggable-on
Ajoutez une fonction de recherche dans Rails.
[Rails] Fonction de gestion des balises (en utilisant des actes comme des balises)
Convertir en balise dans la chaîne d'URL avec Rails
[rails] fonction de classement des balises
Je veux utiliser une petite icône dans Rails
Je souhaite définir une fonction dans la console Rails
Je souhaite ajouter une fonction de suppression à la fonction de commentaire
[Rails] Comment utiliser enum
[Rails] Comment utiliser enum
Comment utiliser la jonction de rails
[Rails] Ajouter une colonne à concevoir
[Rails] Comment utiliser la validation
[Rails] Comment utiliser authenticate_user!
[Rails] Comment utiliser Scope
[Rails 6.0] J'ai essayé d'implémenter une fonction de recherche de balises (une fonction pour affiner par balises) [no gem]
[Rails] Comment utiliser la "devise" des gemmes
[Rails] Comment utiliser les messages flash
Préparation à la création de l'application Rails
La fonction est très facile à utiliser
Comment utiliser Ruby on Rails
[Rails] Comment ajouter de nouvelles pages
Créer une fonction de filtrage en utilisant actes-as-taggable-on
[Rails] Comment utiliser Active Storage
[Rails] Ajoutez des paramètres forts pour concevoir
Comment ajouter la fonction de suppression
[Introduction aux rails] Comment utiliser le rendu
[Rails] Ajoutez un écran de confirmation et un écran de fin pour concevoir l'inscription des membres.
[Rails] Implémentation de la fonction de balise à l'aide de la fonction agit-as-taggable-on et de la fonction de complétion d'entrée de balise à l'aide de tag-it
(Ruby on Rails6) Créer une fonction pour modifier le contenu publié
J'ai essayé de créer une fonction de groupe (babillard) avec Rails
Un mémorandum sur l'utilisation d'Eclipse
Fichier de migration pour ajouter un commentaire à la table Rails
[Rails] Comment utiliser ActiveRecord :: Bitemporal (BiTemporalDataModel)
[Rails] Comment utiliser la méthode de la carte
Comment ajouter un nouveau hachage / tableau
[Retrait des rails] Créez une fonction de retrait simple avec des rails
[Rails] Utiliser la validation sur un contrôleur spécifique
Comment utiliser MySQL dans le didacticiel Rails
Créez quand même une fonction de connexion avec Rails
[Rails] [Note] Quand ajouter = à <%%> et quand pas
[Ruby on Rails] Comment utiliser redirect_to
[rails] Comment créer un modèle partiel
[Note] Comment utiliser Rails 6 Devise + cancancan
[Traitement × Java] Comment utiliser la fonction
[Rails] Comment créer une table, ajouter une colonne et changer le type de colonne
[Rails] Enum est plus facile à utiliser! Énumélisez!
[Rails] Comment utiliser video_tag pour afficher des vidéos
[Rails] Comment utiliser la méthode d'assistance, confimartion
Comment utiliser credentials.yml.enc introduit à partir de Rails 5.2