En ajoutant des balises liées à has_many à User of Devise, nous allons créer une fonction pour suivre les balises comme Qiita.
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.
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.
Vous pouvez maintenant suivre les balises dans votre langage de programmation préféré sur l'écran des paramètres utilisateur.
[* Rails *] Comment utiliser l'appareil (version rails5)
Recommended Posts