[RUBY] Suivez l'implémentation de la fonction (Ajax)

Je vais le préparer moi-même.

la mise en oeuvre

La modélisation

$ rails g model Relationship follower_id:integer followed_id:integer
$ rails db:migrate

Fichier de migration

20200723070930_create_relationships.rb


class CreateRelationships < ActiveRecord::Migration[5.2]
  def change
    create_table :relationships do |t|
      t.integer :follower_id, null: false
      t.integer :followed_id, null: false

      t.timestamps
    end
  end
end

relationship.rb


class Relationship < ApplicationRecord

  #Utilisateurs à suivre
  belongs_to :follower, class_name: 'User'
  #Utilisateurs à suivre
  belongs_to :followed, class_name: 'User'

  validates :follower_id, presence: true
  validates :following_id, presence: true

end

** nom_classe: 'Utilisateur' **: signifie "à la fois l'abonné et le suivi sont dans l'utilisateur"


app/models/user.rb


class User < ApplicationRecord

  #Obtenez suivre
  has_many :follower, class_name: 'Relationship', foreign_key: 'follower_id', dependent: :destroy

  #Obtenez des abonnés
  has_many :followed, class_name: 'Relationship', foreign_key: 'followed_id', dependent: :destroy

  #La personne que vous suivez
  has_many :following_user, through: :follower, source: :followed

  #Les gens qui me suivent (followers)
  has_many :follower_user, through: :followed, source: :follower


  #Suivez les utilisateurs
  def follow(user_id)
    follower.create(followed_id: user_id)
  end

  #Ne plus suivre les utilisateurs
  def unfollow(user_id)
    follower.find_by(followed_id: user_id).destroy
  end

  #Suivre la confirmation
  def following?(user)
    following_user.include?(user)
  end

end

Création de contrôleur

$ rails g controller relationships

config/routes.rb


Rails.application.routes.draw do

  post 'follow/:id', to: 'relationships#follow', as: 'follow'
  post 'unfollow/:id', to: 'relationships#unfollow', as: 'unfollow'
  get 'users/following/:user_id', to: 'users#following', as: 'users_following'
  get 'users/follower/:user_id', to: 'users#follower', as: 'users_follower'

end

users_controller.rb


class UsersController < ApplicationController

  # @Liste des utilisateurs que l'utilisateur suit
  def following
    @user = User.find(params[:user_id])
    @followings = @user.following_user
  end

  # @Liste des utilisateurs suivant l'utilisateur
  def follower
    @user = User.find(params[:user_id])
    @followers = @user.follower_user
  end

end

relationship_controller.rb


class RelationshipsController < ApplicationController

    #Suivre
    def follow
      @user = User.find(params[:id])
      current_user.follow(params[:id])
      render :create
    end
  
    #Se désabonner
    def unfollow
      @user = User.find(params[:id])
      current_user.unfollow(params[:id])
      render :destroy
    end
    
end

En appelant create.js.erb et destroy.js.erb avec render Vous pourrez suivre / ne plus suivre sans transitions de page.


ruby:users/show.html.slim


# create.js.erb et détruire.js.Nécessaire pour réécrire avec erb
div id="follow_form"

  #Ignorer partiellement la partie du bouton de suivi
  = render 'relationships/follow', user: @user 

Créez manuellement le fichier _follow.html.slim sous le répertoire des relations Collez la description de la partie du bouton suivant qui a été ignorée dans le partiel.

ruby:relationships/_follow.html.slim


- unless user == current_user
  - if current_user.following?(user)
  
    #remote pour appeler le fichier js:Ajouter vrai
    = link_to unfollow_path(user), method: :post, remote: true, class: 'btn btn-outline-info m-0 btn-sm' do
      i.fas.fa-utilisateur suivant
  - else
  
    #remote pour appeler le fichier js:Ajouter vrai
    = link_to follow_path(user), method: :post, remote: true, class: 'btn btn-outline-success m-0 btn-sm' do
      i.far.fa-suivi de l'utilisateur

Créez manuellement le fichier create.js.erb sous le répertoire des relations

ruby:relationships/create.js.erb



# id="follow_form"Partie_follow.html.Réécrire du contenu mince sans transition de page
$('#follow_form').html("<%= j(render 'relationships/follow',{ user: @user }) %>");

Créez manuellement le fichier destroy.js.erb sous le répertoire des relations

ruby:relationships/destroy.js.erb



# id="follow_form"Partie_follow.html.Réécrire du contenu mince sans transition de page
$('#follow_form').html("<%= j(render 'relationships/follow',{ user: @user }) %>");

Achevée!

Recommended Posts

Suivez l'implémentation de la fonction (Ajax)
Implémentation de la fonction de commentaire (Ajax)
Implémentation d'une fonction similaire (Ajax)
Implémentation de la fonction DM
Les rails suivent la fonction
[Ruby on Rails] Suivez l'implémentation de la fonction: bidirectionnelle
Où la fonction de suivi est implémentée
Implémentation de la fonction de recherche
Implémentation de la fonction de prévisualisation d'image
Mise en œuvre de la fonction de pagénation
Fonction de recherche [implémentation copier-coller]
Implémentation de la suppression d'ajax dans Rails
Implémentation de la fonction de recherche floue Rails
Implémentation de la fonction de recherche séquentielle
Implémentation de la fonction de prévisualisation d'image
[Rails] Implémentation de la fonction de catégorie
Mise en œuvre de la fonction déroulante de catégorie
[Rails] Implémentation de la fonction tutoriel
[Rails] Implémentation d'une fonction similaire
[Rails] Implémentation de la fonction d'importation CSV
[Rails] Implémentation asynchrone de la fonction similaire
[Rails] Implémentation de la fonction de prévisualisation d'image
[Rails] À propos de la mise en œuvre de la fonction similaire
[Rails] Implémentation de la fonction de retrait utilisateur
[Rails] Implémentation de la fonction d'exportation CSV
[Rails] Implémentation de la fonction de catégorie d'ascendance gemme
[Ruby on Rails] Implémentation de la fonction de commentaire
[Rails] Commentaire mémo de procédure d'implémentation
Erreur rencontrée lors de l'implémentation de la fonction de balisage
Implémentation d'une fonction similaire en Java
[Rails] Je vais expliquer la procédure d'implémentation de la fonction follow en utilisant form_with.
Implémentation de la fonction d'authentification des utilisateurs à l'aide de devise (1)
Rails [Pour les débutants] Implémentation de la fonction de commentaire
Échafaudage de procédure d'implémentation de fonction CRUD de base
Implémentation de la fonction d'authentification des utilisateurs à l'aide de devise (3)
[Ruby on rails] Implémentation d'une fonction similaire
Implémentation de la fonction de connexion par Spring Security (securityConfig)