2010-02-19 3 views
6

Ich bin ein soziales Netzwerk in Rails zu schaffen, und ich habe ein Modell wie folgt aus:Zwei Spalten müssen sich in Rails nicht gleich

create_table "friendships", :force => true do |t| 
    t.integer "user1_id" 
    t.integer "user2_id" 
    t.boolean "hasaccepted" 
    t.datetime "created_at" 
    t.datetime "updated_at" 
end 

Das Problem ist, dass Sie sich als Freund nicht hinzufügen können, so habe ich versucht, dies in meinem Modell:

def validate 
    if :user1_id == :user2_id 
     record.errors.add "You cannot add yourself as a friend." 
     return false 
    end 
end 

Und ich habe dies in meinem Controller:

def addfriend 
    if params[:id] 
     @friendship = Friendship.new() 
     @friendship.user1_id = session[:user] 
     @friendship.user2_id = params[:id] 
     respond_to do |format| 
      if @friendship.save 
       format.html { redirect_to "/" } # Yes, SO users, I will fix this redirect later and it is not important for now. 
       format.xml { render :xml => @friendship, :status => :created } 
      else 
       format.html { redirect_to "/" } 
       format.xml { render :xml => @friendship.errors, :status => :unprocessable_entity } 
      end 
     end 
    end 
end 

(wo session[:user] ist die Benutzer-ID der derzeit in Benutzer signiert)

Allerdings, wenn ich zu http://localhost:3000/profile/addfriend/2.xml gehen, während ich als Benutzer 2 angemeldet bin, Rails gibt mir die neuen Friendship, statt einer Fehlermeldung, und wenn ich eine nehmen Schau dir meine Datenbank an, die Friendship ist auch da (und sollte es nicht). Kann mir bitte jemand erklären, wie ich das beheben kann? Danke

+0

FYI in der Migration, können Sie einfach t.timestamps anstelle von t.datetime "created_at" und t.datetime "updated_at". –

+0

@Beerlington: Ich habe gerade einen Teil von db/schema.rb –

Antwort

13

es so versuchen:

class Friendship < ActiveRecord::Base 
    validate :cannot_add_self 

    private 

    def cannot_add_self 
    errors.add(:user2_id, 'You cannot add yourself as a friend.') if user1_id == user2_id 
    end 
end 
+0

+1 für die gesamte Problem behoben –

+3

Für Schienen 3 muss erros [: base] << "Fehler msg" seit add_to_base wurde aus entfernt Schienen3. Siehe http://stackoverflow.com/questions/10284286/undefined-method-add-to-base –

4
if :user1_id == :user2_id 

Das wird immer falsch sein - Sie vergleichen die Symbole. Es ist das gleiche wie Schreiben if "user1_id" == "user2_id".

Sie sollten es als if user1_id == user2_id schreiben, um die Werte der Spalten zu vergleichen.

+0

+1 für die Erklärung –

Verwandte Themen