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