[Ruby on Rails] Folgen Sie der Funktionsimplementierung: Bidirektional

Ziel

follow.gif

Entwicklungsumgebung

ruby 2.5.7 Rails 5.2.4.3 OS: macOS Catalina

Annahme

fließen

1 Modell erstellen 2 Modell ändern <- Dies ist am schwierigsten 3 Erstellen Sie einen Controller 4 Routing korrigieren 5 Ansicht erstellen

Modell erstellen

Diesmal haben wir ein Beziehungsmodell erstellt

Terminal


$ rails g model Relationship follower_id:integer followed_id:integer

Terminal


$ rails db:migrate
Supplement Die follower_id und die follow_id sind fiktive IDs, die später bei der Änderung des Benutzermodells beschrieben und verwendet werden.

Modell ändern

app/models/relationship.rb


  belongs_to :follower, class_name: "User"
  belongs_to :followed, class_name: "User"
Supplement Ändern Sie den Methodennamen und rufen Sie den mit @relationship verknüpften Benutzerdatensatz in Form von @ Relationship.follower ab. * Die Änderung des Methodennamens dient dazu, Follower und Follower zu trennen.

app/models/user.rb


  has_many :follower, class_name: "Relationship", foreign_key: "follower_id", dependent: :destroy #Folgen Sie uns
  has_many :followed, class_name: "Relationship", foreign_key: "followed_id", dependent: :destroy #Holen Sie sich Follower
  has_many :following_user, through: :follower, source: :followed #Die Person, der Sie folgen
  has_many :follower_user, through: :followed, source: :follower #Leute, die mir folgen

  #Folgen Sie dem Benutzer und verwenden Sie ihn später in der Steuerung.
  def follow(user_id)
    follower.create(followed_id: user_id)
  end
  
  #Folgen Sie dem Benutzer nicht mehr und verwenden Sie ihn später in der Steuerung.
  def unfollow(user_id)
    follower.find_by(followed_id: user_id).destroy
  end
  
  #Gibt true zurück, wenn Folgendes folgt, wird später in der Ansicht verwendet.
  def following?(user)
    following_user.include?(user)
  end
Ergänzung 1 [Über die Zeilen 1 und 2]
has_many :follower
Erstens hat der Benutzer viele Anhänger,
class_name: "Relationship"
Machen Sie es möglich, den mit @user verknüpften @ Beziehungsdatensatz abzurufen.
foreign_key: "follower_id"
Verwenden Sie beim Zugriff auf die Relaitonships-Tabelle follow_id als Eingang
dependent: :destroy
Löschen, wenn der Benutzer weg ist
Ergänzung 2 [Über die Zeilen 3 und 4]
has_many :following_user
Erstens hat der Benutzer viele folgende Benutzer:
through: :follower
Machen Sie den folgenden Benutzer über den Follower verfügbar
source: :followed
Stellen Sie es mit user.following_user zur Verfügung.
Supplement 3 [About (follow_id: user_id)] (follow_id: user_id) ist Ersetzen Sie die Folge-ID durch die Benutzer-ID Es ist leicht zu verstehen, wenn Sie es sich so vorstellen. Der Rest ist buchstäblich.

Controller erstellen

Terminal


$ rails g controller relationships

rb:app/controllers/relationships.controller.rb


  def create
    current_user.follow(params[:user_id])
    redirect_to request.referer
  end
  
  def destroy
    current_user.unfollow(params[:user_id])
    redirect_to request.referer
  end

Diesmal in app / views / Homes / mypage.html.erb Wird an der folgenden Stelle beschrieben, um eine Liste der Follower und Follower anzuzeigen.

rb:app/controllers/homes.controller.rb


  def mypage
    @following_users = current_user.following_user
    @follower_users = current_user.follower_user
  end

Routing korrigieren

rb:config.routes.rb


resources :users do
  resource :relationships, only: [:create, :destroy]
end

Zur Ansicht hinzufügen (wenn eine Instanzvariable vorhanden ist)

erb:app/views/show.html.erb


<% if current_user != user %>
  <% if current_user.following?(@user) %>
    <%= link_to 'Nicht mehr folgen', user_relationships_path(@user.id), method: :delete %>
  <% else %>
    <%= link_to 'Folgen', user_relationships_path(@user.id), method: :POST %>
  <% end %>
<% end %>

erb:app/views/homes/mypage.html.erb


<div>
Anzahl der Follower:<%= current_user.follower.count %>
Anzahl der Follower:<%= current_user.followed.count %>
</div><br><br>
<table>
	<caption>folgenden</caption>
	<thead>
		<tr>
			<th>Nutzername</th>
			<th></th>
		</tr>
	</thead>
	<tbody>
		<% @following_users.each do |following_user| %>
		<tr>
			<td><%= following_user.name %></td>
			<td><%= link_to 'Nicht mehr folgen', user_relationships_path(following_user.id), method: :delete %></td>
		</tr>
		<% end %>
	</tbody>
</table><br><br>

<table>
	<caption>Anhänger</caption>
	<thead>
		<tr>
			<th>Name des Followers</th>
		</tr>
	</thead>
	<tbody>
		<% @follower_users.each do |follower_user| %>
		<tr>
			<td><%= follower_user.name %></td>
		</tr>
		<% end %>
	</tbody>
</table>

Referenz

Recommended Posts