Mettre en œuvre un mécanisme de demande / d'approbation
"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)".
Ruby 2.6.5 Rails 5.2.4.2 mysql 5.7
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
Appliquer Appliquer Ajouter un routage de modèle, des contrôleurs et afficher des fichiers.
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
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.
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. ** **
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 %>
             <%= 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.
Lorsque vous appuyez sur le bouton d'approbation, le traitement suivant est exécuté.
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
Si vous appuyez sur le bouton de rejet, le traitement suivant sera exécuté.
-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