Wie der Titel schon sagt, werden wir eine vereinfachte Version der Instagram-App erstellen. Ich werde den Artikel in den folgenden Schritten schreiben, also hoffe ich, dass Sie ihn Schritt für Schritt lesen werden.
① App-Erstellung - Implementierung der Anmeldefunktion ② Implementierung der Fotoposting-Funktion ③ [Implementierung der Benutzerseite] (https://qiita.com/maca12vel/items/c716702b02f977303011) ④ [Implementierung der Verfolgungsfunktion] (https://qiita.com/maca12vel/items/2760d33f3683fac91de5) ← Imakoko ⑤ Implementierung der Post-Deletion-Funktion
Terminal
rails g model follow user:belongs_to target_user:belongs_to
Ändern Sie die Migrationsdatei.
Ändern Sie  Foreign_key von  target_user in ** false **.
db/migrate/2020**********_create_follows.rb
class CreateFollows < ActiveRecord::Migration[6.0]
  def change
    create_table :follows do |t|
      t.belongs_to :user, null: false, foreign_key: true
      t.belongs_to :target_user, null: false, foreign_key: false
      t.timestamps
    end
  end
end
Sobald dies behoben ist, führen Sie  Rails db: migrate aus.
Stellen Sie die Beziehung zum Follow-Modell ein.
Geben Sie "Klassenname" und "Fremdschlüssel" für "Zielbenutzer" an.
app/models/follow.rb
class Follow < ApplicationRecord
  belongs_to :user
  belongs_to :target_user, class_name: 'User', foreign_key: 'target_user_id'
end
Wir werden auch Beziehungen für das Benutzermodell festlegen.
active_relationships
passive_relationships
Wird beschrieben.
app/models/user.rb
class User < ApplicationRecord
  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :validatable
  has_many :active_relationships, class_name: 'Follow', foreign_key: 'user_id'
  has_many :passive_relationships, class_name: 'Follow', foreign_key: 'target_user_id'
  has_many :followings, through: :active_relationships, source: :target_user
  has_many :followers, through: :passive_relationships, source: :user
  has_many :photos
end
Damit ist die Beziehung abgeschlossen.
Terminal
rails g controller follows
Vergessen Sie nicht, auch das Routing festzulegen.
routes.rb
Rails.application.routes.draw do
  root 'homes#index'
  devise_for :users
  resources :photos
  resources :users do
    resource :follow #← hier
  end
end
Die URL sollte nun wie folgt aussehen: "user / user_id / follow".
Bearbeiten Sie als Nächstes den  folgenden Controller.
folows_controller.rb
class FollowsController < ApplicationController
  before_action :authenticate_user!
  def create
    current_user.active_relationships.create(target_user_id: params[:user_id])
    redirect_to [:user, {id: params[:user_id] }]
  end
  def destroy
    current_user.active_relationships.find_by(target_user_id: params[:user_id]).destroy
    redirect_to [:user, {id: params[:user_id] }]
  end
end
Durch Setzen von before_action: authenticate_user!
Nur angemeldete Benutzer können "folgen / nicht folgen".
Stellen Sie die Folgebewegung mit der Aktion "Erstellen" ein.
Das Umleitungsziel ist [: user, {id: params [: user_id]}]
Es ist so eingestellt, dass es zur Benutzer-ID des Benutzers übergeht, dh zur Detailseite des Benutzers.
Stellen Sie die Entfolgebewegung in der "Zerstörungsaktion" ein.
Holen Sie sich zuerst den Datensatz, dem Sie folgen, mit "find_by" anstelle von "create".
Dann zerstört es den von  destroy erfassten Datensatz.
Ich denke, es ist in Ordnung, zum selben Ziel umzuleiten.
erb:app/views/users/show.html.erb
<h3><%= @user.email %></h3>
#↓↓↓↓↓↓↓↓↓↓ Von hier aus ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
<% if current_user.active_relationships.exists?(target_user_id: @user.id) %>
  <%= link_to 'unfollow', [@user, :follow], method: :delete %>
<% else %>
  <%= link_to 'follow', [@user, :follow], method: :post %>
<% end %>
#Bis hierher
<div>
  <%= link_to 'followings', [@user, :followings] %>
</div>
<div>
  <%= link_to 'followers', [@user, :followers] %>
</div>
<% @user.photos.each do |photo| %>
  <div>
    <p><%= photo.caption %></p>
    <%= image_tag photo.image %>
  </div>
<% end %>
Mit bedingter Verzweigung
Wenn  current_user dem Benutzer bereits gefolgt ist
Zeigen Sie den Link zum Aufheben an. → ** Methode: löschen **
Wenn Sie noch nicht gefolgt sind, wird ein Link zum Folgen angezeigt. → ** Methode: Post **
Lassen Sie es uns bisher einmal mit einem Browser überprüfen.
Wenn es wie folgt aussieht, ist es erfolgreich.
Wechseln Sie zur Seite mit den Benutzerdetails und drücken Sie "Folgen", um den Vorgang abzuschließen.
Dann ändert sich  follow in  unfollow.
Drücken Sie  unfollow, um nicht mehr zu folgen und zu  follow zurückzukehren.

In diesem Status jedoch Benutzer, die nicht angemeldet sind
Wenn Sie direkt auf die URL zugreifen, wird eine Fehlermeldung angezeigt. ↓

Dies liegt daran, dass der bedingte Zweig  current_user verwendet.
Daher werden wir weitere bedingte Zweige hinzufügen.
Fügen Sie den bedingten Zweig mit ↓ ein.
<% if user_signed_in? && current_user != @user %>
<% end %>
erb:app/views/users/show.html.erb
<h3><%= @user.email %></h3>
<% if user_signed_in? && current_user != @user %> #← hier
  <% if current_user.active_relationships.exists?(target_user_id: @user.id) %>
    <%= link_to 'unfollow', [@user, :follow], method: :delete %>
  <% else %>
    <%= link_to 'follow', [@user, :follow], method: :post %>
  <% end %>
<% end %> #← hier
<div>
  <%= link_to 'followings', [@user, :followings] %>
</div>
<div>
  <%= link_to 'followers', [@user, :followers] %>
</div>
<% @user.photos.each do |photo| %>
  <div>
    <p><%= photo.caption %></p>
    <%= image_tag photo.image %>
  </div>
<% end %>
Benutzer ist angemeldet in
Und
 current_user ist nicht der Benutzer auf der Benutzerdetailseite
Dies bedeutet, dass der bedingte Zweig hinzugefügt wird.
Wenn Sie nicht angemeldet sind, wird der Link "Folgen / Nicht folgen" nicht angezeigt. Außerdem wird es nicht angezeigt, wenn Sie zu Ihrer Detailseite springen.
Damit ist die Verfolgungsfunktion fast abgeschlossen. Zum Schluss möchte ich eine Liste der Benutzer sehen, die verfolgt werden.
Terminal
rails g controller followings
Terminal
rails g controller followers
Vergessen Sie nicht, auch das Routing festzulegen.
routes.rb
Rails.application.routes.draw do
  root 'homes#index'
  devise_for :users
  resources :photos
  resources :users do
    resource :follow
    resources :followings #← hier
    resources :followers #← hier
  end
end
Wir werden auch jeden in der Steuerung beschreiben.
folowings_controller.rb
class FollowingsController < ApplicationController
  def index
    @followings = User.find(params[:user_id]).followings
  end
end
folowers_controller.rb
class FollowersController < ApplicationController
  def index
    @followers = User.find(params[:user_id]).followers
  end
end
Und wir werden eine Ansicht erstellen.
Zeigen Sie  email von  Following / Follower mit  link_to an.
Ich erstelle einen Link zur Seite mit den Benutzerdetails.
erb:app/views/followings/index.html.erb
<% @followings.each do |following| %>
  <div>
    <%= link_to following.email, [following] %>
  </div>
<% end%>
erb:app/views/followers/index.html.erb
<% @followers.each do |follower| %>
  <div>
    <%= link_to follower.email, [follower] %>
  </div>
<% end%>
Die Angabe des Pfades ist
[following]→user_followings_path
[follower]→user_followers_path
Aber es ist okay, also leicht zu verstehen.
Erstellen Sie abschließend einen Link auf der Benutzerdetailseite.
erb:app/views/users/show.html.erb
<h3><%= @user.email %></h3>
<% if user_signed_in? && current_user != @user %>
  <% if current_user.active_relationships.exists?(target_user_id: @user.id) %>
    <%= link_to 'unfollow', [@user, :follow], method: :delete %>
  <% else %>
    <%= link_to 'follow', [@user, :follow], method: :post %>
  <% end %>
<% end %>
#↓↓↓↓↓↓↓↓↓↓ Von hier aus ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
<div>
  <%= link_to 'followings', [@user, :followings] %>
</div>
<div>
  <%= link_to 'followers', [@user, :followers] %>
</div>
#Bis hierher
<% @user.photos.each do |photo| %>
  <div>
    <p><%= photo.caption %></p>
    <%= image_tag photo.image %>
  </div>
<% end %>
Der Pfad der anzuzeigenden Seite lautet
 Followings von  @ user
 Follower von  @ user
Es wird sein.
Lassen Sie uns die Operation damit überprüfen.
Wenn es wie folgt aussieht, ist es erfolgreich.

Es ist schnell und schwer zu verstehen, aber es beginnt mit dem Status der Anmeldung mit sample.
①  sample springt zur Detailseite von  example und ** folgt **.
② Wenn Sie auf der Beispieldetailseite zum folgenden Link springen, sehen Sie das Beispiel, dem Sie gerade gefolgt sind.
③ Wenn Sie auf der Detailseite des Beispiels zum Link "Follower" springen, sehen Sie "Beispiel".
das ist alles. Danke für deine harte Arbeit.
Recommended Posts