我有以下用户模型:
class User < ActiveRecord::Base
validates :email, presence:true
end
当我这样做时:
@user = User.find_or_create_by(:email => params[:email])
我在做@ user.nil?为了查看用户是否在那里,但它没有按照我的想法行事:
puts @user.inspect
--> #<User id: nil, email: "", created_at: nil, updated_at: nil>
为什么用户会被创建,即使没有保存在数据库中?如何确保@user为“nil”? @ user.id.nil?
由于
答案 0 :(得分:1)
您可以通过以下方式询问是否为新记录:
@user.new_record?
答案 1 :(得分:1)
用户记录未保存,因为它有一个空白电子邮件(“”),因此状态验证失败。您可以使用@user.errors.full_messages
检查错误消息。
如果保存操作失败(包括验证),则Active记录调用.create
(或其衍生产品之一)将返回新记录。如果您希望在用户记录无效时引发错误,则可以使用.create!
,并使用(!)。我建议这个与Rails 4兼容的新语法:
# Raises an Error if no matching record is found and the new record fails to save.
@user = User.where(:email => params[:email]).first_or_create!
# Does not raise an error if new record fails to save. The returned object will be a new record with post-validation error states.
@user = User.where(:email => params[:email]).first_or_create
您选择哪种方法取决于您希望应用程序的行为方式。