Implementieren Sie einen Antrags- / Genehmigungsmechanismus
"Ein Benutzer (Konishi) möchte einer bestimmten Community beitreten. Dies ist ein Implementierungsbeispiel für den Fall, dass ein Abonnement die Genehmigung des Community-Administrators (Onishi) erfordert.
Ruby 2.6.5 Rails 5.2.4.2 mysql 5.7
Ich erstelle eine Anwendung, mit der Benutzer verschiedenen Communities angehören können. --Benutzermodell: Enthält Benutzerinformationen zur Verwendung der App
Die folgende Quelle ist nur ein Auszug aus dem zugehörigen Teil
user.rb
class User < ApplicationRecord
has_many :belongings, dependent: :destroy
has_many :applies, dependent: :destroy
has_many :communities, through: :belongings #Die Community, zu der der Benutzer gehört
end
community.rb
class Community < ApplicationRecord
has_many :belongings, dependent: :destroy
has_many :applies, dependent: :destroy
has_many :users, through: :belongings #Benutzer, die zur Community gehören
#Gibt true zurück, wenn der Benutzer einer Community angehört
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
Anwenden Anwenden Fügen Sie Modellrouting, Controller und Ansichtsdateien hinzu.
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
--Anwendungsschaltfläche (auf dem Community-Detailbildschirm platziert) (views/communities/show.html.erb)
show.html.erb
<!--Wenn der angemeldete Benutzer zur Community gehört-->
<% if @community.user_belonging?(current_user) %>
<%= link_to 'Abheben', community_belonging_path(@community, @belonging), method: :delete, data:{ confirm: "Gemeinschaft"#{@community.name}Austritt aus der Mitgliedschaft. Ist es o.k?" } ,class:"mini-red-link-btn font-bold text-line-none" %>
<!--Wenn Sie nicht mit der Community verbunden sind, aber angemeldet sind-->
<% elsif current_user %>
<% if @apply %>
<%= link_to 'Stornierung der Anmeldung', community_apply_path(@community, @apply), method: :delete, class: "mini-red-link-btn font-bold text-line-none" %>
<% else %>
<%= link_to 'Antrag auf Mitgliedschaft', community_applies_path(@community), method: :post, class: "mini-green-link-btn font-bold text-line-none" %>
<% end %>
Die Anwendungstaste wird unter den folgenden Bedingungen angezeigt.
--Nach dem Drücken der Anwendungstaste (Aktion zum Erstellen erfolgt)
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: "Ich habe die Mitgliedschaft beantragt"
end
private
def apply_params
params.permit(:community_id)
end
end
Verwenden Sie Ajax nicht und stellen Sie sicher, dass die Umleitung zum selben Bildschirm erfolgt. (Sie können Ajax verwenden)
** Die Anwendungsinformationen werden jetzt zum Anwendungsmodell hinzugefügt. ** ** **
Überprüfen Sie als nächstes die Warteliste. Der Administrator (Onishi) öffnet den Bildschirm "Warteliste für Anwendungen" über den entsprechenden Community-Bildschirm.
--Link zum Anwendungswartebildschirm (Community-Detailbildschirm) (views/communities/show.html.erb)
show.html.erb
<% if user_admin_flg(current_user,@community) == 1 %>
<%= link_to "Warteliste für die Genehmigung", community_applies_path(@community), class:"btn btn-primary" %>
<% end %>
Klicken Sie auf den Link, um den Bildschirm mit der Warteliste für Anwendungen zu öffnen.
index.html.erb
<div class="container applicant-wrapper">
<h3>Liste der Benutzer, die auf die Genehmigung warten</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 "Die Genehmigung", 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 "Abgelehnt", community_apply_path(app.community, app), method: :delete, class:"mini-red-link-btn font-bold text-line-none" %>
<br>
</div>
<% end %>
</div>
</div>
Aus dem Anwendungsmodell werden die Anwendungsinformationen für die relevante Community in einer Liste angezeigt. Auf demselben Bildschirm sind auch eine Genehmigungsschaltfläche und eine Ablehnungsschaltfläche angeordnet.
Wenn Sie auf die Schaltfläche Genehmigen klicken, wird die folgende Verarbeitung ausgeführt.
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}Aber die Community:#{@belonging.community.name}Ich bin beigetreten."
end
private
def belonging_params
params.permit(:community_id, :user_id, :apply_id)
end
end
Wenn Sie die Zurückweisungstaste drücken, wird die folgende Verarbeitung ausgeführt.
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: ""
end
end
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: "2. Weiterleiten an die Anwendungswarteliste Bildschirm-gilt Die Anwendung für den Beitritt zum Controller wurde abgebrochen. Im Text werden der Apps-Controller und der Besitz-Controller für jede Aktion separat vorgestellt, aber ich werde sie am Ende alle zusammen auflisten. Ich habe die Mitgliedschaft beantragt"
end
def destroy
@apply = Apply.find(params[:id])
@apply.destroy!
@comminity = Community.find(params[:community_id])
redirect_to community_url(@comminity), notice: "Ich habe meine Bewerbung storniert"
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}Aber die Community:#{@belonging.community.name}Ich bin beigetreten."
end
def destroy
@belonging = Belonging.find(params[:id])
@belonging.destroy!
@comminity = Community.find(params[:community_id])
redirect_to community_url(@comminity), notice: "Gemeinschaft"#{@comminity.name}Ich habe mich zurückgezogen."
end
private
def belonging_params
params.permit(:community_id, :user_id, :apply_id)
end
end
Da der Anfänger den Logikcode mit seinem eigenen Verstand dachte und implementierte, Es kann Fehler und bessere Implementierungen geben. Ich würde es begrüßen, wenn Sie darauf hinweisen könnten.
Ich denke, diese Implementierung gibt Ihnen ein besseres Verständnis für die Viele-zu-Viele-Beziehung.
Recommended Posts