Comme le titre l'indique, nous allons créer une version simplifiée de l'application instagram. J'écrirai l'article dans les étapes suivantes, j'espère donc que vous le lirez étape par étape.
① Création d'application - Implémentation de la fonction de connexion ② Mise en œuvre de la fonction de publication de photos ③ [Implémentation de la page utilisateur] (https://qiita.com/maca12vel/items/c716702b02f977303011) ④ [Implémentation de la fonction Follow] (https://qiita.com/maca12vel/items/2760d33f3683fac91de5) ← Imakoko ⑤ Implémentation de la fonction de post-suppression
Terminal
rails g model follow user:belongs_to target_user:belongs_to
Modifiez le fichier de migration. Remplacez la clé étrangère de l'utilisateur cible par ** 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
Une fois corrigé, exécutez `` rails db: migrate ''.
Définissez la relation au modèle de suivi ''.  Spécifiez nom_classe '' et clé_tranger '' pour utilisateur_cible ''.
app/models/follow.rb
class Follow < ApplicationRecord
  belongs_to :user
  belongs_to :target_user, class_name: 'User', foreign_key: 'target_user_id'
end
Nous allons également définir des relations pour le «modèle utilisateur».
active_relationships
passive_relationships
Sera décrit.
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
Ceci termine la relation.
Terminal
rails g controller follows
N'oubliez pas de définir également le routage.
routes.rb
Rails.application.routes.draw do
  root 'homes#index'
  devise_for :users
  resources :photos
  resources :users do
    resource :follow #← ici
  end
end
L'URL devrait maintenant ressembler à «user / user_id / follow».
Ensuite, modifiez le `` contrôleur suit ''.
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
En définissant `` before_action: authenticate_user! '' Seuls les utilisateurs connectés peuvent «suivre / ne plus suivre».
Définissez le mouvement de suivi avec créer une action ''.  La destination de la redirection est [: user, {id: params [: user_id]}] ``
Il est configuré pour passer à l'ID utilisateur de l'utilisateur, c'est-à-dire à la page de détails de l'utilisateur.
Réglez le mouvement de non-suivi dans l'action de destruction ''.  Tout d'abord, récupérez l'enregistrement que vous suivez avec find_byau lieu de create.  Ensuite, il détruit le record acquis par  détruire ''.
Je pense que vous pouvez rediriger vers la même destination.
erb:app/views/users/show.html.erb
<h3><%= @user.email %></h3>
#↓↓↓↓↓↓↓↓↓↓ À partir d'ici ↓↓↓↓↓↓↓↓↓↓
<% 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 %>
#↑↑↑↑↑↑↑↑↑↑↑ Jusqu'ici ↑↑↑↑↑↑↑↑↑↑
<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 %>
Avec branchement conditionnel
Si  current_user suivait déjà l'utilisateur
Affichez le lien pour vous désabonner. → ** méthode: supprimer **
Si vous n'avez pas encore suivi, un lien pour suivre sera affiché. → ** méthode: post **
Jusqu'à présent, vérifions-le une fois avec un navigateur.
Si cela ressemble à ce qui suit, c'est réussi.
Accédez à la page des détails de l'utilisateur et appuyez sur suivre '' pour terminer le suivi.  Ensuite, suivre '' devient ne plus suivre ''.  Appuyez sur ne plus suivre '' pour ne plus suivre et revenir à `` suivre ''

Cependant, dans cet état, les utilisateurs qui ne sont pas connectés
Si vous accédez directement à l'URL, vous obtiendrez une erreur. ↓

C'est parce que la branche conditionnelle utilise  current_user.
Par conséquent, nous ajouterons plus de branches conditionnelles.
Insérez la branche conditionnelle avec ↓.
<% 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 %> #← ici
  <% 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 %> #← ici
<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 %>
L'utilisateur est connecté ''  Et  current_user n'est pas l'utilisateur sur la page de détails de l'utilisateur ''
Cela signifie que la branche conditionnelle est ajoutée.
Désormais, si vous n'êtes pas connecté, vous ne verrez pas le lien "Suivre / Ne plus suivre". De plus, il ne sera pas affiché lorsque vous accédez à votre page de détails.
Ceci complète presque la fonction de suivi, Enfin, j'aimerais voir une liste d'utilisateurs qui sont suivis.
Terminal
rails g controller followings
Terminal
rails g controller followers
N'oubliez pas de définir également le routage.
routes.rb
Rails.application.routes.draw do
  root 'homes#index'
  devise_for :users
  resources :photos
  resources :users do
    resource :follow
    resources :followings #← ici
    resources :followers #← ici
  end
end
Nous décrirons également chacun dans le contrôleur.
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
Et nous allons créer une vue.
Afficher respectivement  suivant / suiveur ```emailavec link_to``,
Je crée un lien vers la page des détails de l'utilisateur.
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%>
La spécification du chemin est
[following]→user_followings_path
[follower]→user_followers_path
Mais ça va, donc c'est facile à comprendre.
Enfin, créez un lien sur la page de détails de l'utilisateur.
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 %>
#↓↓↓↓↓↓↓↓↓↓ À partir d'ici ↓↓↓↓↓↓↓↓↓↓
<div>
  <%= link_to 'followings', [@user, :followings] %>
</div>
<div>
  <%= link_to 'followers', [@user, :followers] %>
</div>
#↑↑↑↑↑↑↑↑↑↑↑ Jusqu'ici ↑↑↑↑↑↑↑↑↑↑
<% @user.photos.each do |photo| %>
  <div>
    <p><%= photo.caption %></p>
    <%= image_tag photo.image %>
  </div>
<% end %>
Le chemin de la page à afficher est
Suivis '' de @ user   Followers '' de  @ user
Ce sera.
Vérifions l'opération avec ceci.
Si cela ressemble à ce qui suit, c'est réussi.

C'est rapide et difficile à comprendre, mais cela commence par l'état de connexion avec sample.
①  sample saute à la page de détail de  example et ** follow **.
(2) Si vous passez au lien suivant '' sur la page de détails de l'exemple, vous pouvez voir l'exemple '' que vous venez de suivre.
③ Si vous passez au lien followers '' sur la page de détail de l'exemple, vous pouvez voir sample``.
c'est tout. Je vous remercie pour votre travail acharné.
Recommended Posts