[RUBY] [Rails] Fügen Sie Tags, die sich auf has_many beziehen, zu Devise User hinzu (Hinzufügen einer Funktion zum Folgen von Tags)

Einführung

Durch Hinzufügen von Tags, die sich auf has_many beziehen, zu User of Devise erstellen wir eine Funktion, um Tags wie Qiita zu folgen.

Umgebung

Überblick

Devise hat standardmäßig keine Benutzernamensspalte. Im Internet gibt es viele Informationen zum Hinzufügen einer Benutzernamensspalte. Um jedoch die Möglichkeit zu schaffen, Tags zu folgen, müssen Sie Tags hinzufügen, bei denen es sich um eine has_many-Beziehung handelt. Dazu gibt es nicht viele Informationen. Deshalb habe ich die Methode zusammengefasst.

Code

Sie können das Rails-Projekt hier herunterladen. 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 Erstellen Sie eine Migrationsdatei, ein Tag-Modell und ein User-Tag-Relation-Modell, die dem Benutzer einen Namen hinzufügen.

db/migrate/20200716151945_add_name_to_users.rb


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

Es ist nicht notwendig, aber ich werde eine Spalte mit dem Benutzernamen hinzufügen, weil es eine große Sache ist.

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

Erstellen Sie eine Tag-Tabelle wie oben.

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

Erstellen Sie eine Zwischentabelle, die Benutzer mit Tags verknüpft.

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

Beschreiben Sie has_many im Benutzermodell.

app/models/user_tag_relation.rb


class UserTagRelation < ApplicationRecord
  belongs_to :user
  belongs_to :tag
end

Beschreiben Sie Gehört zu im UserTagRelation-Modell.

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

Beschreiben Sie has_many im Tag-Modell.

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

Registrieren Sie den Namen und die tag_ids in Devise.

config/initializers/devise.rb


config.scoped_views = true

Setzen Sie es auf true anstatt auf false, um die Geräteansicht zu ändern.

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


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

Ermöglicht das Festlegen eines Benutzernamens auf dem neuen Registrierungsbildschirm.

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>

Hier können Sie einen Benutzernamen und ein Tag festlegen, die auf dem Bildschirm mit den Benutzereinstellungen angezeigt werden sollen.

Ausführungsergebnis

DeviseWithTags.jpg

Sie können jetzt Tags in Ihrer bevorzugten Programmiersprache auf dem Bildschirm mit den Benutzereinstellungen folgen.

Verweise

[* Rails *] Verwendung von Devise (Rails5-Version)

Recommended Posts

[Rails] Fügen Sie Tags, die sich auf has_many beziehen, zu Devise User hinzu (Hinzufügen einer Funktion zum Folgen von Tags)
[Schienen] Spalte zum Entwickeln hinzufügen
[Schienen] Fügen Sie starke Parameter hinzu, um sie zu entwickeln
[Rails] Hinzufügen der Ruby On Rails-Kommentarfunktion
Implementierung der Benutzerauthentifizierungsfunktion mit devise (2)
Schienen Hinzufügen einer einfachen Anmeldefunktion
Implementierung der Benutzerauthentifizierungsfunktion mit devise (1)
Implementierung der Benutzerauthentifizierungsfunktion mit devise (3)
[Rails6] So verbinden Sie die von Scaffold generierte Buchungsfunktion mit der von devise generierten Benutzerfunktion
Verwenden Sie [Rails], um eine Gastbenutzerfunktion zu entwickeln (für das Portfolio).
Tag-Funktion zu Rails hinzufügen. Verwenden Sie Acts-as-Taggable-On
Schienen folgen der Funktion
Implementierung der Ruby on Rails-Anmeldefunktion (Devise Edition)
Führen Sie devise with Rails ein, um Benutzerverwaltungsfunktionen zu implementieren