2016-04-05 7 views
0

Ich habe Gruppen von Benutzern. Ein Benutzer erstellt eine Gruppe und ist der Eigentümer. Sie können Anfragen annehmen/ablehnen (was gut funktioniert), Gruppen erstellen (funktioniert auch) und ich möchte, dass sie Gruppenmitglieder löschen können (was nicht funktioniert). Aus irgendeinem Grund kann der Besitzer der Gruppe nur aus der Gruppe gelöscht werden.Wie man eine has_many: durch die Verbindung von ausgewählten Benutzer

Wie richte ich die Controller-Aktion/Ansicht ein, damit der Besitzer Gruppenmitglieder löschen kann?

P.S. Ich möchte dafür kein Autorisierungssystem verwenden. Es sollte einfach genug sein, nur in der Steuerung zu tun. Ich muss nur ein Gruppenmitglied löschen können. Gruppen = Cliqs. Ich habe keine Mitgliedschaften zu einer verschachtelten Ressource von Gruppen gemacht.

Der Fehler: Konnte CliqMembership mit 'ID' = 2 nicht finden [WHERE cliq_memberships. ? user_id =]

Hier ist mein Controller-Aktion:

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

    @cliq_membership.destroy 
    redirect_to cliqs_path 
end 

Meine Modelle:

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 

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

    has_many :cliq_memberships, dependent: :destroy 
    has_many :cliqs, through: :cliq_memberships 
end 

My View Controller-Aktion:

def show 
    @cliq = Cliq.find(params[:id]) 
    @cliq_owner = @cliq.owner 
    @cliq_members = @cliq.members 
    @pending_members = @cliq.pending_members 
    @cliq_requests = @cliq.cliq_requests #(find a way to show all incoming requests) 
    @cliq_memberships = CliqMembership.all 
end 

Und mein "Ist" Ansicht:

<div> 
    <% @cliq.members.each do |member| %> 
    <ul><%= link_to member.username, user_path(member) %></ul> 
    <% end %> 
    <% @cliq.cliq_memberships.each do |cliq_membership| %> 
    (<%= link_to "Delete Member", cliq_membership, :method => :delete %>) 
    <% end %> 
</div> 

Log:

Cliq Load (0.0ms) SELECT `cliqs`.* FROM `cliqs` LIMIT 1 
CliqMembership Load (0.5ms) SELECT `cliq_memberships`.* FROM `cliq_memberships` WHERE `cliq_memberships`.`cliq_id` = 4 AND `cliq_memberships`.`id` = 9 LIMIT 1 
Completed 404 Not Found in 18ms (ActiveRecord: 0.5ms) 

ActiveRecord::RecordNotFound (Couldn't find CliqMembership with 'id'=9 [WHERE `cliq_memberships`.`cliq_id` = ?]): 
app/controllers/cliq_memberships_controller.rb:44:in `destroy' 
+0

Wenn es ausfällt, ist ein Fehler irgendwo angemeldet? Was ist die Nachricht? Wenn Sie nicht sicher sind, versuchen Sie, 'destroy' zu' destroy! 'Zu ändern. –

+0

Ich werde die Frage aktualisieren, um die Fehlermeldung mit einzuschließen. –

+0

Danke, würden Sie bitte auch das Bit aus Ihrer 'log/development.log' Datei hinzufügen, die die DELETE Anfrage abdeckt. –

Antwort

0

try Änderung has_many :cliq_memberships, dependent: :destroy zu has_many :cliq_memberships, dependent: :destroy, foreign_key: 'member_id'

+0

Ich bin gerade nicht an meinem Computer, aber ich werde es versuchen. Muss ich class_name oder: source angeben? –

+0

Sie müssten Ihre Schematabelle überprüfen. Ich vermute, dass in der Tabelle cliq_memberships die von Ihnen verwendete ausländische ID 'member_id' statt' user_id' ist, deshalb erhalten Sie die Fehlermeldung –

0

ich Code durch Überprüfung meiner Anfrage gelöst (die auch eine has_many ist: durch die Verbindung und hat ähnliche Aktionen). Nicht sicher, warum ich so lange gebraucht habe, um es zu lösen.

Ich änderte meine Methode dazu:

def destroy 
    @cliq = Cliq.find_by(params[:cliq_id]) 
    @cliq_membership = CliqMembership.find(params[:id]) 

    @cliq_membership.destroy 
     flash[:notice] = "You left the Cliq." 
    redirect_to cliqs_path 
end 
Verwandte Themen