2010-02-19 2 views
6

Я создаю социальную сеть в Rails и у меня есть модель, как это:Две колонны должны не равны друг другу в Rails

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 

Проблема заключается в том, что вы не можете добавить себя в другом, так что я пытался это в моей модели:

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

И у меня есть это в мой контроллер:

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 

(где session[:user] является УИДОМ в настоящее время регистрируется пользователь)

Однако, когда я иду в http://localhost:3000/profile/addfriend/2.xml в то время как я подписал как пользователь 2, Rails возвращает мне новый Friendship, вместо сообщения об ошибке, и когда я взять посмотрите мою базу данных, также есть Friendship (и это не должно). Может кто-нибудь, пожалуйста, объясните мне, как это исправить? Спасибо

+0

FYI в вашей миграции, вы можете просто использовать t.timestamps вместо t.datetime "created_at" и "t.datetime updated_at". –

+0

@Beerlington: Я просто скопировал часть db/schema.rb – 2010-02-19 17:16:55

ответ

13

Попробуйте так:

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

√ для исправления всей проблемы – 2010-02-19 13:45:58

+3

Для рельсов 3 необходимо использовать erros [: base] << "Ошибка msg", так как add_to_base был удален из Rails3. См. Http://stackoverflow.com/questions/10284286/undefined-method-add-to-base –

4
if :user1_id == :user2_id 

Это всегда будет ложным - вы сравниваете символы. Это то же самое, что писать if "user1_id" == "user2_id".

Чтобы сравнить значения столбцов, вы должны написать if user1_id == user2_id.

+0

+1 для объяснения – 2010-02-19 13:45:39

Смежные вопросы