2016-06-22 8 views
0

In Ruby versuche ich zu verhindern, dass Benutzer jemanden als Freund hinzufügen, wenn einer von ihnen den anderen auf seiner Ignorierliste hat. In der Freundschaften Controller, versuche ichRuby, before_action confusion

class FriendshipsController < ApplicationController 
before_action :ignored_user, only: :create 

Und

def ignored_user 
    if current_user.foes.include?(@user) 
    flash[:notice] = "Unable to send friend request." 
    redirect_to :back 
    end 
end 

In diesem Zusammenhang zu definieren, current_user der Benutzer, der angemeldet ist, ist @user der Benutzer, dessen Profil sie sehen , und Feinde bedeutet "entweder jemanden, den sie ignorieren wollen oder jemand, der sie ignoriert." All das scheint zu funktionieren, außer der Zeile "if current_user blah blah". Wenn ich es durch "If current_user.admin" ersetzen? dann funktioniert es genau so, wie Sie es erwarten würden. Wenn dieser Benutzer ein Administrator ist, kann er keine Freundschaftsanfragen senden. Wenn ich es durch "if current_user.id == 2" ersetze, funktioniert es auch wie erwartet. Ich habe versucht, die defekte Leitung mit vielen, vielen Variationen des obigen Codes zu ersetzen, einschließlich solcher Dinge wie:

if Disagreement.where(foe_id: [@user, params[:id]], user_id: [current_user, params[:id]]).first 

des an anderer Stelle arbeitet, nur nicht in der Freundschaften Controller.

Wie für Fehlermeldungen: Es gibt keine. Meine Versuche enden entweder mit dem Hinzufügen des Freundes, wenn er nicht erwünscht ist, oder dem Blockieren aller Freundesanfragen, einschließlich Freundschaftsanfragen an Benutzer, die nicht ignoriert werden. Jede Hilfe mit diesem würde sehr geschätzt werden.

+1

Wo haben Sie @ @ user einen Wert zugewiesen? Ich nehme an, dass '@ user'' nil' ist und 'current_user.foes.include? (Nil)' immer 'false' ist. Um solche Probleme zu beheben, können Sie 'puts '@user is: # {@ user}" 'hinzufügen und die Serverausgabe in der Konsole überprüfen, um zu sehen, was vor sich geht. –

+1

Besser noch, sagen Sie uns den Wert von 'current_user',' current_user.foes' und '@ user'. TIPP: Anstelle von "if foo.bar.first" tue 'if foo.bar.exists?' Anstatt "Disagreement" in diesem Fall zu instanziieren, gibt es "true" oder "false" zurück. – Leito

+0

Whoops, atuser (stackoverflow lässt mich diese Antwort nicht posten, wenn ich nicht "atuser" schreibe) wird im users_controller unter der Aktion Show (und einigen anderen) definiert. Du hattest Recht! Nach dem Hinzufügen der Konsolenausgabe "atuser is:". Ich habe versucht, atuser durch "User.find (params [: id])" zu ersetzen, aber dieser Fehler wird zurückgegeben: ActiveRecord :: RecordNotFound in FriendshipsController # create Konnte Benutzer mit 'ID' nicht finden = raise RecordNotFound, " # {Name} konnte nicht mit '# {primary_key}' = # {id} " gefunden werden. In Zeile 37 ist dies der" if current_user usw. " Linie. – Display

Antwort

0

Eine viel klügere Person als ich gab mir die Lösung. Ich habe den Abschnitt "before_action: ignored_user, only:: create" sowie den Abschnitt "def ignored_user" vollständig entfernt. Alles das ist mit dieser Fassung:

class FriendshipsController < ApplicationController 

    def create 
    @user = User.find(params[:friend_id]) 
    if current_user.foes.include?(@user) 
     flash[:notice] = "Unable to send friend request. You are ignoring this user or vice versa." 
     redirect_to :back 
     puts "@user is: #{@user}" #This line only existed for the sake of figuring out the problem 
     puts "@user.id is: #{@user.id}" #Same 
     puts "current_user.foes are: #{current_user.foes}" #Same 
    else 
     @friendship = current_user.friendships.build(friend_id: params[:friend_id]) 
     if @friendship.save 
     flash[:notice] = "Friend request sent!" 
     redirect_to :back 
     end 
    end 
    end 

Das Problem war, dass die Freundschaften Controller nicht in beliebiger Weise erkennen @user könnte es in der Regel definiert ist, aufgrund der params [: id] Teil. Da dies für die Verwendung im Freundschafts-Controller neu geschrieben wird, nimmt der Controller an, dass mit "ID" die ID einer Freundschaft gemeint ist, nicht die ID eines Benutzers. Die Person, die mir die Lösung gab, erkannte, dass Sie einfach ": id" durch ": friend_id" ersetzen konnten, da im Kontext dieser Aktion diese beiden IDs immer synonym sind, da Sie immer Personen aus ihren eigenen hinzufügen werden Profilseite. So habe ich nie herausgefunden, wie direkt Bezug auf eine Benutzer-ID aus einem anderen Controller, aber ich habe gelernt, die nächstbeste Sache.