[Ruby on Rails] Suivez l'implémentation de la fonction: bidirectionnelle

Cible

follow.gif

Environnement de développement

ruby 2.5.7 Rails 5.2.4.3 OS: macOS Catalina

supposition

couler

1 Créer un modèle 2 Modifier le modèle <-C'est le plus difficile 3 Créer un contrôleur 4 Fixer le routage 5 Créer une vue

Créer un modèle

Cette fois, nous avons créé un modèle de relation

Terminal


$ rails g model Relationship follower_id:integer followed_id:integer

Terminal


$ rails db:migrate

<détails>

Supplément </ summary> Le follower_id et le follow_id sont des identifiants fictifs, qui seront décrits et utilisés ultérieurement dans la modification du modèle utilisateur. </ détails>

Modifier le modèle

app/models/relationship.rb


  belongs_to :follower, class_name: "User"
  belongs_to :followed, class_name: "User"

<détails>

Supplément </ summary> Modifiez le nom de la méthode et obtenez l'enregistrement utilisateur associé à @relationship sous la forme @ relation.follower.

  • Le changement de nom de méthode consiste à séparer les adeptes et les adeptes. </ détails>

app/models/user.rb


  has_many :follower, class_name: "Relationship", foreign_key: "follower_id", dependent: :destroy #Obtenez suivre
  has_many :followed, class_name: "Relationship", foreign_key: "followed_id", dependent: :destroy #Obtenez des abonnés
  has_many :following_user, through: :follower, source: :followed #La personne que vous suivez
  has_many :follower_user, through: :followed, source: :follower #Les gens qui me suivent

  #Suivez l'utilisateur et utilisez-le plus tard dans le contrôleur.
  def follow(user_id)
    follower.create(followed_id: user_id)
  end
  
  #Arrêtez l'utilisateur et utilisez-le plus tard dans le contrôleur.
  def unfollow(user_id)
    follower.find_by(followed_id: user_id).destroy
  end
  
  #Renvoie vrai si suivant, sera utilisé ultérieurement dans la vue.
  def following?(user)
    following_user.include?(user)
  end
Supplément 1 [À propos des lignes 1 et 2]
has_many :follower
Premièrement, l'utilisateur a de nombreux abonnés,
class_name: "Relationship"
Rendre possible d'obtenir l'enregistrement @relationship associé à @user,
foreign_key: "follower_id"
Lors de l'accès à la table des relations, utilisez follow_id comme entrée
dependent: :destroy
Supprimer lorsque l'utilisateur est parti
Supplément 2 [À propos des lignes 3 et 4]
has_many :following_user
Premièrement, l'utilisateur a de nombreux utilisateurs suivants,
through: :follower
Rendre l’utilisateur suivant disponible via un abonné
source: :followed
Rendez-le disponible avec user.following_user.
Supplément 3 [About (follow_id: user_id)] (follow_id: user_id) est Remplacez user_id par follow_id C'est facile à comprendre si vous l'imaginez comme ça. Le reste est littéralement.

Créer un contrôleur

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

Cette fois dans app / views / homes / mypage.html.erb Décrit à l'emplacement suivant pour afficher une liste d'adeptes et d'adeptes.

rb:app/controllers/homes.controller.rb


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

Correction du routage

rb:config.routes.rb


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

Ajouter à la vue (s'il existe une variable d'instance)

erb:app/views/show.html.erb


<% if current_user != user %>
  <% if current_user.following?(@user) %>
    <%= link_to 'Se désabonner', user_relationships_path(@user.id), method: :delete %>
  <% else %>
    <%= link_to 'Suivre', user_relationships_path(@user.id), method: :POST %>
  <% end %>
<% end %>

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


<div>
Nombre d'abonnés:<%= current_user.follower.count %>
Nombre d'abonnés:<%= current_user.followed.count %>
</div><br><br>
<table>
	<caption>Suivant</caption>
	<thead>
		<tr>
			<th>Nom d'utilisateur</th>
			<th></th>
		</tr>
	</thead>
	<tbody>
		<% @following_users.each do |following_user| %>
		<tr>
			<td><%= following_user.name %></td>
			<td><%= link_to 'Se désabonner', user_relationships_path(following_user.id), method: :delete %></td>
		</tr>
		<% end %>
	</tbody>
</table><br><br>

<table>
	<caption>Disciple</caption>
	<thead>
		<tr>
			<th>Nom du suiveur</th>
		</tr>
	</thead>
	<tbody>
		<% @follower_users.each do |follower_user| %>
		<tr>
			<td><%= follower_user.name %></td>
		</tr>
		<% end %>
	</tbody>
</table>

référence

Recommended Posts