[RUBY] [Rails] Implémentation d'une fonction de demande / d'approbation d'adhésion à la communauté à l'aide d'associations plusieurs-à-plusieurs

Que veux-tu faire

Mettre en œuvre un mécanisme de demande / d'approbation

En particulier?

"Un utilisateur (Konishi) souhaite rejoindre une certaine communauté, Il s'agit d'un exemple d'implémentation dans le cas de "l'abonnement nécessite l'approbation de l'administrateur de la communauté (Onishi)".

Image approximative

キャプチャ.PNG

Présentation du flux de traitement

  1. Sur l'écran de la communauté correspondante, l'utilisateur (Konishi) appuie sur le bouton «Appliquer».
  2. L'utilisateur (Konishi) est ajouté à la liste d'attente des candidatures de la communauté concernée. L'administrateur regarde l'écran de la liste d'attente des candidatures de la communauté concernée et décide d'approuver ou non le candidat.
  3. Pour approuver la demande, appuyez sur le bouton d'approbation. L'utilisateur candidat rejoint la communauté et est retiré de la liste d'attente des candidatures.
  4. Pour rejeter la candidature, appuyez sur le bouton de rejet. Il sera supprimé de la liste d'attente des candidatures.

environnement

Ruby 2.6.5 Rails 5.2.4.2 mysql 5.7

Configuration des fonctionnalités actuelles de l'application

Je crée une application qui permet aux utilisateurs d'appartenir à différentes communautés. --user model: contient les informations utilisateur pour l'utilisation de l'application --Modèle communautaire: détenir des informations sur la communauté --belonging model: contient les informations de la communauté à laquelle appartient l'utilisateur. Les utilisateurs peuvent appartenir à plusieurs communautés.

La source suivante est un extrait de seulement la partie liée

user.rb


class User < ApplicationRecord

  has_many :belongings, dependent: :destroy
  has_many :applies, dependent: :destroy
  has_many :communities, through: :belongings #La communauté à laquelle appartient l'utilisateur

end

community.rb


class Community < ApplicationRecord
    has_many :belongings, dependent: :destroy
    has_many :applies, dependent: :destroy
    has_many :users, through: :belongings #Utilisateurs appartenant à la communauté

    #Renvoie true si l'utilisateur appartient à une communauté
    def user_belonging?(user)
      users.include?(user)
    end

end

belonging.rb


class Belonging < ApplicationRecord
    belongs_to :user
    belongs_to :community
    validates :user_id, presence: true
    validates :community_id, presence: true

    validates  :user_id, uniqueness: { scope: :community_id }
    validates  :community_id, uniqueness: { scope: :user_id }

end

Ajoutez un modèle Apply et conservez l'état de l'application.

Appliquer Appliquer Ajouter un routage de modèle, des contrôleurs et afficher des fichiers.

Routage (extrait)

routes.rb


Rails.application.routes.draw do
  root 'home#index'

  resources :communities do
    resources :applies, only: %i[index create destroy]
    resources :belongings, only: %i[index create destroy]
  end

  resources :users, only: [:index, :show]

end

1. Sur l'écran de la communauté concernée, l'utilisateur (Konishi) appuie sur le bouton «Appliquer».

show.html.erb


<!--Si l'utilisateur connecté appartient à la communauté-->
<% if @community.user_belonging?(current_user) %>
    <%= link_to 'Se désister', community_belonging_path(@community, @belonging), method: :delete, data:{ confirm: "communauté"#{@community.name}Retirer de l'adhésion. Est-ce que c'est bon?" } ,class:"mini-red-link-btn font-bold text-line-none" %>
<!--Si vous n'êtes pas affilié à la communauté mais que vous êtes connecté-->
<% elsif current_user %>
    <% if @apply %>
        <%= link_to 'Annulation de la demande', community_apply_path(@community, @apply), method: :delete, class: "mini-red-link-btn font-bold text-line-none" %>
    <% else %>
        <%= link_to 'Demande d'adhésion', community_applies_path(@community), method: :post, class: "mini-green-link-btn font-bold text-line-none" %>
    <% end %>

Le bouton d'application s'affichera dans les conditions suivantes.

  1. Si vous êtes déjà membre de la communauté: Un bouton de désinscription s'affiche
  2. Si vous n'avez pas encore rejoint la communauté: Le bouton de l'application sera affiché
  3. Si vous avez déjà fait une demande d'adhésion: affichez le bouton d'annulation de la demande

applies_controller.rb


class AppliesController < ApplicationController

  def create
    current_user.applies.create(community_id: apply_params[:community_id])
    redirect_to community_url(apply_params[:community_id]), notice: "J'ai fait une demande d'adhésion"
  end

  private

    def apply_params
      params.permit(:community_id)
    end

end

N'utilisez pas Ajax et assurez-vous que la redirection vers le même écran se produit. (Vous pouvez utiliser Ajax)

** Les informations d'application sont maintenant ajoutées au modèle d'application. ** **

2. L'utilisateur (Konishi) est ajouté à la liste d'attente des candidatures de la communauté concernée. L'administrateur regarde l'écran de la liste d'attente des candidatures de la communauté concernée et décide d'approuver ou non le candidat.

Ensuite, vérifiez la liste d'attente. L'administrateur (Onishi) ouvre l'écran "Liste d'attente des applications" à partir de l'écran de communauté concerné.

show.html.erb


<% if user_admin_flg(current_user,@community) == 1 %>
    <%= link_to "Liste d'attente d'approbation", community_applies_path(@community), class:"btn btn-primary" %>
<% end %>

Cliquez sur le lien pour ouvrir l'écran de la liste d'attente des candidatures.

index.html.erb


<div class="container applicant-wrapper">
    <h3>Liste des utilisateurs en attente d'approbation</h3>
    <div class="row">
        <% @applies.each do |app| %>
        <div class="col-6">
            <% if app.user.image.attached? %>
                <%= link_to app.user.image, user_path(app.user), class:"user-icon" %>
            <% else %>
                <%= link_to user_path(app.user) do %>
                    <%= image_tag ("no_image.png "), class:"user-icon" %>
                <% end %>
            <% end %>
            &nbsp<%= app.user.username %><br>
            <%= link_to "Approbation", community_belongings_path(app.community, user_id: app.user.id, apply_id: app.id), method: :post, class:"mini-green-link-btn font-bold text-line-none" %>
            <%= link_to "Rejeté", community_apply_path(app.community, app), method: :delete, class:"mini-red-link-btn font-bold text-line-none" %>
            <br>
        </div>
        <% end %>
    </div>
</div>

À partir du modèle d'application, les informations sur l'application à la communauté appropriée sont affichées dans une liste. Sur le même écran, un bouton d'approbation et un bouton de rejet sont également disposés.

3. Pour approuver la demande, appuyez sur le bouton d'approbation. L'utilisateur candidat rejoint la communauté et est retiré de la liste d'attente des candidatures.

Lorsque vous appuyez sur le bouton d'approbation, le traitement suivant est exécuté.

  1. L'action de création du contrôleur des biens est exécutée.
  2. Puisqu'elles sont supprimées de la liste d'attente des applications, les informations d'application correspondantes du modèle Apply sont supprimées.
  3. Redirection vers l'écran de la liste d'attente des candidatures

belongings_controller.rb


class BelongingsController < ApplicationController

    def create
        @belonging = Belonging.create(community_id: belonging_params[:community_id], user_id: belonging_params[:user_id])
        Apply.find(belonging_params[:apply_id]).destroy!
        redirect_to community_applies_url(@belonging.community), notice:"「#{@belonging.user.username}Mais la communauté:#{@belonging.community.name}J'ai rejoint."
    end

    private

        def belonging_params
            params.permit(:community_id, :user_id, :apply_id)
        end

end

4. Pour rejeter la candidature, appuyez sur le bouton de rejet. Il sera supprimé de la liste d'attente des candidatures.

Si vous appuyez sur le bouton de rejet, le traitement suivant sera exécuté.

  1. Pour supprimer de la liste d'attente des applications, l'action de destruction du contrôleur d'applications est exécutée et les informations d'application correspondantes du modèle Apply sont supprimées.
  2. Rediriger vers l'écran de la liste d'attente des candidatures

-applies contrôleur

applies_controller.rb


class AppliesController < ApplicationController

  def destroy
    @apply = Apply.find(params[:id])
    @apply.destroy!
    @comminity = Community.find(params[:community_id])
    redirect_to community_url(@comminity), notice: "J'ai annulé ma candidature"
  end

end

C'est tout.

Dans le texte, le contrôleur des applications et le contrôleur des effets personnels sont introduits séparément pour chaque action, mais je les énumérerai tous ensemble à la fin.

applies_controller.rb


class AppliesController < ApplicationController

  def create
    current_user.applies.create(community_id: apply_params[:community_id])
    redirect_to community_url(apply_params[:community_id]), notice: "J'ai fait une demande d'adhésion"
  end

  def destroy
    @apply = Apply.find(params[:id])
    @apply.destroy!
    @comminity = Community.find(params[:community_id])
    redirect_to community_url(@comminity), notice: "J'ai annulé ma candidature"
  end

  def index
    @applies = Apply.where(community_id: params[:community_id])
  end

  private

    def apply_params
      params.permit(:community_id)
    end

end

belongings_controller.rb


class BelongingsController < ApplicationController

    def create
        @belonging = Belonging.create(community_id: belonging_params[:community_id], user_id: belonging_params[:user_id])
        Apply.find(belonging_params[:apply_id]).destroy!
        redirect_to community_applies_url(@belonging.community), notice:"「#{@belonging.user.username}Mais la communauté:#{@belonging.community.name}J'ai rejoint."
    end

    def destroy
        @belonging = Belonging.find(params[:id])
        @belonging.destroy!
        @comminity = Community.find(params[:community_id])
        redirect_to community_url(@comminity), notice: "communauté"#{@comminity.name}Je me suis retiré."    
    end

    private

        def belonging_params
            params.permit(:community_id, :user_id, :apply_id)
        end

end

Puisque le débutant a pensé et implémenté le code logique avec son propre esprit, Il peut y avoir des erreurs et de meilleures implémentations. Je vous serais reconnaissant si vous pouviez le signaler.

Je pense que cette implémentation vous donne une meilleure compréhension de la relation plusieurs-à-plusieurs.

Recommended Posts

[Rails] Implémentation d'une fonction de demande / d'approbation d'adhésion à la communauté à l'aide d'associations plusieurs-à-plusieurs
Implémenter la fonction d'application dans Rails
Créer une fonction d'authentification dans l'application Rails à l'aide de devise
Mettre en œuvre la fonction de classement par étoiles en utilisant Raty dans Rails 6
Implémenter la fonction de recherche de publication dans l'application Rails (méthode where)
[Rails] Implémenter la fonction de recherche d'utilisateurs
Fonction de recherche à l'aide de [rails] ransack
[Rails] Implémenter la fonction de fin d'événement (suppression logique) en utilisant la paranoïa (gem)
Implémenter la fonction de catégorie en utilisant l'ancêtre
[Rails] Implémenter la fonction de publication d'images
[Rails] Implémentation de fonctions de catégorie plusieurs à plusieurs
[Rails] Présentation de PAY.JP
[Rails] Implémentation d'une fonction de demande / d'approbation d'adhésion à la communauté à l'aide d'associations plusieurs-à-plusieurs
Implémentation de la suppression d'ajax dans Rails
[Rails] Introduction aux principes de base du dispositif
Utilisation du type booléen Rails
À propos des types de couverture de code
[Rails] Implémentation de la fonction de catégorie
[Rails] Implémentation d'une fonction similaire
[Rails] Fonction de gestion des balises (en utilisant des actes comme des balises)
Implémenter une fonction de connexion simple dans Rails
Implémenter la fonction de téléchargement CSV dans Rails
Pour implémenter la publication d'images à l'aide de rails
Implémenter des transitions de boutons à l'aide de link_to dans Rails