如何确保执行SQL语句,然后才开始下一个代码步骤

时间:2015-04-23 07:00:26

标签: mysql ruby-on-rails ruby activerecord devise

执行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

2 个答案:

答案 0 :(得分:1)

您确定您的模型通过了所有验证吗?您应该检查.save是否返回true - 如果没有,请检查.errors

如果没有验证问题,应立即执行保存。

答案 1 :(得分:1)

我确定您的记录未被保存,当您检查记录时,它只显示对象的初始化副本,您是否可以使用save!查看是否有任何例外或User.first_or_create! < / p>

@user = User.first_or_initialize
@user.save!