我是 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
它确实有效,因为用户的电子邮件地址未正确传递。这可以通过将
@user.exists?(:username)
更改为 @user.exists?(params[:username])
来解决。
但是 Ruby on Rails 包含此类验证,您不需要自己编写它们。使用 Rails 存在性和唯一性验证,如下所示:
# in your user.rb
validates :username, presence: true, uniqueness: true
您可能想忽略大小写:
# in your user.rb
validates :username, presence: true, 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
在模型文件中像这样使用
validates_uniqueness_of :username #=> or specify :email or :name etc...
按照建议,您应该对此类事情使用模型验证。但是,这就是您的代码不起作用的原因。
exists?
方法用于模型类,而不是它的实例,例如:
Person.exists?(5)
Person.exists?(:name => "David")
以上来自 存在吗?文档