Rails中两列不能相等

6 validation model ruby-on-rails equals

我在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
Run Code Online (Sandbox Code Playgroud)

问题是你不能把自己添加为朋友,所以我在我的模型中尝试了这个:

def validate
    if :user1_id == :user2_id
        record.errors.add "You cannot add yourself as a friend."
        return false
    end
end
Run Code Online (Sandbox Code Playgroud)

我在我的控制器中有这个:

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
Run Code Online (Sandbox Code Playgroud)

(session[:user]当前登录用户的uid 在哪里)

但是,当我以http://localhost:3000/profile/addfriend/2.xml用户身份登录时2,Rails返回给我新的Friendship,而不是错误消息,当我查看我的数据库时,Friendship它也在那里(它不应该).有人可以解释一下如何解决这个问题吗?谢谢

Jim*_*dra 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
Run Code Online (Sandbox Code Playgroud)

  • 对于rails 3,需要使用erros [:base] <<"Error msg",因为add_to_base已从Rails3中删除.请参阅http://stackoverflow.com/questions/10284286/undefined-method-add-to-base (3认同)