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.
Ruby 2.5.7 Rails 5.2.4.2 Utiliser le design Bootstrap
① 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.
new.html.erb
index.html.erb
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.
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