我是Rails的新手,正在尝试为我的网站创建一个注册表单。它工作正常,但有一个例外-将用户保存到数据库中,而无需先检查用户是否存在。在保存之前,我该如何检查以确保用户存在?
用户控制器:
class UsersController < ApplicationController
def new
@user = User.new
end
def create
@user = User.new(user_params)
if @user.exists?(:username) == false && @user.save(user_params)
session[:id] = @user.id
redirect_to posts_path
else
redirect_to '/signup'
end
end
def edit
end
def update
end
def show
end
def destroy
end
private
def user_params
params.require(:user).permit(:username, :jabber_id, :password)
end
end
答案 0 :(得分:4)
一个非常简单的验证就是这样:
# in your user.rb
validates :username, uniqueness: true
您可能要忽略大小写:
# in your user.rb
validates :username, uniqueness: { case_sensitive: false }
然后将您的create
方法更改为以下内容:
def create
@user = User.new(user_params)
if @user.save
session[:id] = @user.id
redirect_to posts_path
else
render :new
end
end
此外,我建议在数据库级别也具有唯一索引:
# in a migration
add_index :users, :username, unique: true
答案 1 :(得分:1)
像这样在模型文件中使用
validates_uniqueness_of :username #=> or specify :email or :name etc...
答案 2 :(得分:0)
如建议的那样,您应该对此类使用模型验证。但是,这就是您的代码无法正常工作的原因。
exists?
方法将用于模型类,而不是其实例,例如:
Person.exists?(5)
Person.exists?(:name => "David")
以上内容来自exists? docs
答案 3 :(得分:0)
正如上面的几乎所有人所建议的那样,这是使用uniqueness验证的最佳方法。
但是,如果您想尝试使用exists? 你可以喜欢,
User.exists?(用户名:params [:username])