执行Ruby代码时,我的行为非常奇怪。我用@user = User.first_or_initialize
然后我@user.save
制作新模型,但奇怪的是,当我尝试使用Devise辅助方法sign_in @user
时,它会失败,因为到那时SQL查询还没有执行。我在控制台看到过它。我在puts @user.inspect
之后立即sign_in @user
。在终端我有令人不快的惊喜,因为puts @user.inspect
向我显示User
模型没有id
,这也意味着sign_in @user
传递User
没有id
1}}。并且在终端中显示所有put之后进行SQL查询INSERT INTO users
。
基本上我的问题是,如何锁定ruby代码执行,直到SQL语句执行完毕?因此,当我将@user
传递给sign_in
时,它会通过User
模型传递id
???
修改
@user = User.where(:uid => @shop[:uid]).first_or_initialize
if @user.persisted?
puts 'Persisted.'
false
else
# New customer
....
@user.save
sign_in @user
end
答案 0 :(得分:1)
您确定您的模型通过了所有验证吗?您应该检查.save
是否返回true - 如果没有,请检查.errors
。
如果没有验证问题,应立即执行保存。
答案 1 :(得分:1)
我确定您的记录未被保存,当您检查记录时,它只显示对象的初始化副本,您是否可以使用save!
查看是否有任何例外或User.first_or_create!
< / p>
@user = User.first_or_initialize
@user.save!