find_or_create_by,其属性在Rails中为presence:true

时间:2013-12-17 17:43:12

标签: ruby-on-rails

我有以下用户模型:

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?

由于

2 个答案:

答案 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

您选择哪种方法取决于您希望应用程序的行为方式。