[RUBY] [Rails] Ajouter des balises liées à has_many à Devise User (ajout d'une fonction pour suivre les balises)

introduction

En ajoutant des balises liées à has_many à User of Devise, nous allons créer une fonction pour suivre les balises comme Qiita.

environnement

Aperçu

Devise n'a pas de colonne de nom d'utilisateur par défaut. Et il y a beaucoup d'informations sur le net sur la façon d'ajouter une colonne de nom d'utilisateur. Cependant, pour créer la possibilité de suivre les balises, vous devez ajouter des balises, qui sont une relation has_many, et il n'y a pas beaucoup d'informations à ce sujet. Par conséquent, j'ai résumé la méthode.

code

Vous pouvez télécharger le projet Rails ici. https://github.com/GuiltyWorks/DeviseWithTags

bin/rails g migration add_name_to_users name:string bin/rails g model tag bin/rails g model user_tag_relation Créez un fichier de migration, un modèle de balise et un modèle UserTagRelation qui ajoutent un nom à User.

db/migrate/20200716151945_add_name_to_users.rb


class AddNameToUsers < ActiveRecord::Migration[5.2]
  def change
    add_column :users, :name, :string
  end
end

Ce n'est pas nécessaire, mais je vais ajouter une colonne de nom d'utilisateur car c'est un gros problème.

db/migrate/20200716152422_create_tags.rb


class CreateTags < ActiveRecord::Migration[5.2]
  def change
    create_table :tags do |t|
      t.string :name, null: false, unique: true

      t.timestamps
    end
  end
end

Créez une table de balises comme celle ci-dessus.

db/migrate/20200716152440_create_user_tag_relations.rb


class CreateUserTagRelations < ActiveRecord::Migration[5.2]
  def change
    create_table :user_tag_relations do |t|
      t.references :user, foreign_key: true
      t.references :tag, foreign_key: true

      t.timestamps
    end
  end
end

Créez une table intermédiaire qui associe les utilisateurs à des balises.

app/models/user.rb


class User < ApplicationRecord
  # Include default devise modules. Others available are:
  # :confirmable, :lockable, :timeoutable, :trackable and :omniauthable
  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :validatable

  validates :name, { presence: true }
  validates :email, { presence: true, uniqueness: true }

  has_many :user_tag_relations, dependent: :delete_all
  has_many :tags, through: :user_tag_relations
end

Décrivez has_many dans le modèle User.

app/models/user_tag_relation.rb


class UserTagRelation < ApplicationRecord
  belongs_to :user
  belongs_to :tag
end

Décrivez appartient_to dans le modèle UserTagRelation.

app/models/tag.rb


class Tag < ApplicationRecord
  validates :name, { presence: true, uniqueness: true }

  has_many :user_tag_relations, dependent: :delete_all
  has_many :users, through: :user_tag_relations
end

Décrivez has_many dans le modèle Tag.

app/controllers/application_controller.rb


class ApplicationController < ActionController::Base
  before_action :configure_permitted_parameters, if: :devise_controller?

  protected

  def configure_permitted_parameters
    devise_parameter_sanitizer.permit(:sign_up, keys: [:name])
    devise_parameter_sanitizer.permit(:sign_in, keys: [:name])
    devise_parameter_sanitizer.permit(:account_update, keys: [:name, tag_ids: []])
  end
end

Enregistrez le nom et les tag_ids dans Devise.

config/initializers/devise.rb


config.scoped_views = true

Définissez-le sur true au lieu de false pour modifier la vue Devise.

ERB:app/views/devise/registrations/new.html.erb


<div class="field">
  <%= f.label :name %>
  <%= f.text_field :name %>
</div>

Vous permet de définir un nom d'utilisateur sur le nouvel écran d'enregistrement.

ERB:app/views/devise/registrations/edit.html.erb


<div class="field">
  <%= f.label :name %>
  <%= f.text_field :name %>
</div>

<div class="field">
  <%= f.label :tag_ids, "Tags you want follow" %>
  <%= f.collection_check_boxes :tag_ids, Tag.all, :id, :name do |tag| %>
    <div class="form-check">
      <%= tag.label class: "form-check-label" do %>
        <%= tag.check_box class: "form-check-input" %>
        <%= tag.text %>
      <% end %>
    </div>
  <% end %>
</div>

Vous permet de définir un nom d'utilisateur et une balise à suivre sur l'écran des paramètres utilisateur.

Résultat d'exécution

DeviseWithTags.jpg

Vous pouvez maintenant suivre les balises dans votre langage de programmation préféré sur l'écran des paramètres utilisateur.

Les références

[* Rails *] Comment utiliser l'appareil (version rails5)

Recommended Posts

[Rails] Ajouter des balises liées à has_many à Devise User (ajout d'une fonction pour suivre les balises)
[Rails] Ajouter une colonne à concevoir
[Rails] Ajoutez des paramètres forts pour concevoir
[Rails] Ajout de la fonction de commentaire Ruby On Rails
Implémentation de la fonction d'authentification des utilisateurs à l'aide de devise (2)
Rails Ajout d'une fonction de connexion facile et facile
Implémentation de la fonction d'authentification des utilisateurs à l'aide de devise (1)
Implémentation de la fonction d'authentification des utilisateurs à l'aide de devise (3)
[Rails6] Comment connecter la fonction d'affichage générée par Scaffold avec la fonction utilisateur générée par devise
Utilisez [Rails] pour concevoir la fonction utilisateur invité (pour le portefeuille)
Ajoutez une fonction de balise aux rails. Utilisez actes-comme-taggable-on
Les rails suivent la fonction
Implémentation de la fonction de connexion Ruby on Rails (édition de devise)
Introduire la conception avec Rails pour implémenter la fonctionnalité de gestion des utilisateurs