0

Ich habe ein Benutzermodell, ein Gruppenmodell (Cliq) und ein group_membership Modell (Cliq_Membership). Alles scheint bisher gut zu funktionieren. Ich habe es derzeit so, dass, wenn ein Benutzer eine Gruppe erstellt, sie ihn "besitzen" und wenn ein "Besitzer" die Gruppe verlässt (ihre Gruppenzugehörigkeit zerstört), wird die gesamte Gruppe zerstört. Eine Gruppe hat einen Besitzer und viele Mitglieder. Ich möchte es so machen, dass ein Benutzer beantragen muss, ein "Mitglied" zu sein. Ich möchte, dass der "Eigentümer" der einzige ist, der die Anfragen sieht und die Anfragen akzeptiert/ablehnt.Wie können Benutzer aufgefordert werden, eine Gruppenmitgliedschaft anzufordern?

Für Klarheit:

  • Ich Nutzer wollen Gruppenmitglieder beantragen müssen sein
  • Ich möchte Cliqs der Lage sein, Benutzer zu verlangen, um Mitglieder
  • Es sollte nur der Besitzer in der Lage sein zu sehen,/accept/deny Freundanfragen
  • Ich möchte, dass die Beziehung "zweiseitig/selbstreferenziell" ist; das heißt, ich will die Benutzer/Mitglied werden gezeigt als in der Gruppe enthalten ist und die Gruppe als ein anderes Mitglied mit
  • Cliqs = Gruppen

Wie erreichen Sie das?

Hier ist mein Code so weit:

Modelle:

class User < ActiveRecord::Base 
has_many :uploads 
has_one :owned_cliq, foreign_key: 'owner_id', class_name: 'Cliq', dependent: :destroy 

has_many :cliq_memberships 
has_many :cliqs, through: :cliq_memberships 
end 

class CliqMembership < ActiveRecord::Base 
belongs_to :cliq 
belongs_to :user 
end 

class Cliq < ActiveRecord::Base 
belongs_to :owner, class_name: 'User' 

has_many :cliq_memberships, dependent: :destroy 
has_many :members, through: :cliq_memberships, source: :user 

end 

Controller:

class CliqMembershipsController < ApplicationController 

def create 
    #Cliq or Cliq_ID? 
    @cliq = Cliq.find(params[:cliq]) 

    @cliq_membership = current_user.cliq_memberships.build(cliq: @cliq) 
    @cliq.members << current_user 

    if @cliq_membership.save 
     flash[:notice] = "Joined #{@cliq.name}" 
    else 
     flash[:notice] = "Not able to join Cliq." 
    end 
    redirect_to cliq_url 
end 

def destroy 
    @cliq_membership = current_user.cliq_memberships.find(params[:id]) 
    @cliq = @cliq_membership.cliq 

    if @cliq.owner == current_user 
     @cliq.destroy 
     flash[:notice] = "Cliq has been deleted." 
     redirect_to current_user 
    else 
    @cliq_membership.destroy 
     flash[:notice] = "You left the Cliq." 
    redirect_to current_user 
    end 
end 
end 

class CliqsController < ApplicationController 

def show 
    @cliq = Cliq.find(params[:id]) 
end 

def new 
    @cliq = Cliq.new(params[:id]) 
end 

def create 
    @cliq = current_user.build_owned_cliq(cliq_params) 
    @cliq.members << current_user 

    if @cliq.save 
     redirect_to current_user 
    else 
     redirect_to new_cliq_path 
    end 
end 

def destroy 
    #@cliq = current_user.owned_cliq.find(params[:id]) 
    #lash[:alert] = "Are you sure you want to delete your Cliq? Your Cliq and all of its associations will be permanently deleted." 
    #@cliq.destroy 

    #if @cliq.destroy 
     #redirect_to current_user 
     #flash[:notice] = "You deleted the Cliq." 
    #else 
     #redirect_to current_user 
     #set up error handler 
     #flash[:notice] = "Failed to delete Cliq." 
    #end 
end 


def cliq_params 
    params.require(:cliq).permit(:name, :cliq_id) 
end 
end 

Antwort

1

Sie ein anderes Modell und Controller Benutzer erstellen kann

erstellen request.rb fordert für den Umgang mit Modell

class Request < ActiveRecord::Base 
belongs_to :user 
belongs_to :cliq 
end 

erstellen requests_controller.rb.

class RequestsController < ApplicationController 

    before_action :set_group 
    before_action :auth_group_owner 
    before_action :find_request, except: [:index, :create] 

    def index 
    end 

    def create 
    @grp.requests.where(user_id: current_user.id).first_or_create 
    # redirect the user 
    end 

    def approv 
    # add the user to the group 
    @request.destroy 
    # redirect 
    end 

    def destroy 
    #delete the request 
    end 

    private 

    def set_group 
    #find group @grp 
    end 

    def auth_group_owner 
    if current_user != @grp.owner 
    redirect 
    end 
    end 

    def find_request 
    #find request 
    end 

end 

Ihre routes.rb

resources :groups do 
    resources :requests, only: [:index, :destroy] do 
    member do 
     get 'approv' 
    end 
    end 
end 
+0

Wie würde ich eine Anfrage erstellen (senden)? –

+0

Das sollte jetzt funktionieren. –

0

Die folgende Lösung sollte ein neues Modell ohne die Schaffung für Anfragen arbeiten. Das Hinzufügen eines neuen booleschen Feldes zum CliqMembership-Modell, um zu speichern, ob eine bestimmte cliq_membership bestätigt ist oder nicht, ist ausreichend. (Lassen Sie uns das Feld rufen ‚bestätigt‘, zum Beispiel)

class User < ActiveRecord::Base 
    has_many :cliq_memberships 
    has_many :cliqs, through: :cliq_memberships 
    has_many :confirmed_memberships, -> { confirmed }, class_name: "CliqMembership" 
    has_many :confirmed_cliqs, through: :confirmed_memberships, source: :cliq 
end 

class CliqMembership < ActiveRecord::Base 
    belongs_to :cliq 
    belongs_to :user 

    scope :confirmed, -> { where(confirmed: true) } 
end 

class Cliq < ActiveRecord::Base 
    has_many :cliq_memberships, dependent: :destroy 
    has_many :members, through: :cliq_memberships, source: :user 
    has_many :confirmed_memberships, { confirmed }, class_name: "CliqMembership" 
    has_many :confirmed_members, through: :confirmed_memberships, source: :user 
end 

Damit Sie den Wert confirmed Feld false Voreingestellt können, wenn eine neue cliq_membership von einem Benutzer erstellt wird. Bis der Besitzer update ist das bestimmte cliq_membership, um den Wert confirmed zu true zu ändern.

Unter der Annahme, user & cliq Instanzen von User-Modell jeweils & Cliq-Modell können Sie jetzt user.confirmed_cliqs und cliq.confirmed_members verwenden.

Edit:

Um die Bearbeitung & Update-Aktionen auf cliq_membership nur auf den cliq Eigentümer zu beschränken, können Sie ein vor Filter verwenden.

class CliqMembershipsController < ApplicationController 
    before_action :cliq_owner, only: [:edit, :update] 

    def edit 
    @cliq_membership = CliqMembership.find(params[:id]) 
    end 

    def update 
    @cliq_membership = CliqMembership.find(params[:id]) 
    @cliq_membership.update_attributes(cliq_membership_params) 
    end 

    private 
    def cliq_membership_params 
     params.require(:cliq_membership).permit(:cliq_id, :user_id, :confirmed) 
    end 

    def cliq_owner 
     @cliq = CliqMembership.find(params[:id]).cliq 
     redirect_to root_url unless @cliq.owner == current_user 
    end 
end 

Ich hoffe, es funktioniert für Sie.

+0

Das scheint wirklich nah an dem zu sein, was ich versucht habe zu bekommen. Wie sollte ich meine Controller-Aktionen ändern? Und wie sende ich eine Anfrage an den Cliq/Cliq-Besitzer? –

+0

Sie müssen 'edit' &' update' Aktionen in 'CliqMembershipsController' durchführen, um das' confirmed' Feld von false auf true zu setzen. Ich aktualisierte die Antwort, um einzuschließen, wie man das Privileg auf den cliq Inhaber beschränkt. – Vishal

+0

Das macht Sinn. Wie würde der Cliq eine Anfrage an einen Benutzer senden, damit der Benutzer antwortet und dem Cliq beitritt? –

Verwandte Themen