0

我有以下代码:

用户.rb

  def self.create_with_omniauth(auth)
    create! do |user|
      user.provider = auth["provider"]
      user.uid = auth["uid"]
      user.name = auth["info"]["name"]
      # Add an error message when email is already taken
      user.email = auth["info"]["email"]
      user.password = user.password_confirmation = SecureRandom.urlsafe_base64(n=6) 
    end
  end

session_controller.rb:

 def omniauth_create
    auth = request.env["omniauth.auth"]
    user = User.from_omniauth(env["omniauth.auth"])
    if user.save
      sign_in user
      redirect_back_or user
    else
      #session[:omniauth] = request.env['omniauth.auth'].except('extra')
      redirect_to signup_path
      flash.now[:error] = 'Worked!'
    end
  end

现在此代码不起作用,因为create! do在 User 模型中保存了用户,并且在执行到达控制器并通过 if 语句之前引发了错误。所以我想new! do改用,但得到了这个:

undefined method `new!' for #<Class:0xb5aaf04>

为什么“创造!做”没有“新!做”?

(我采取了错误的方法来解决这个问题?如果是这样,我可以应用哪些其他解决方案?)

4

2 回答 2

2

我不认为有一种new!方法,我只知道create!save!

new并且build只初始化对象而不保存到数据库save中,并且create同时进行初始化和保存。

最后的爆炸是如果发生错误而不是返回false,则引发异常。

因此,如果您使用,则new必须save!保留记录。

  def self.create_with_omniauth(auth)
    pw = SecureRandom.urlsafe_base64(6) 
    record = new(
      provider: auth["provider"],
      uid: auth["uid"],
      name: auth["info"]["name"],
      # Add an error message when email is already taken
      email: auth["info"]["email"],
      password: pw,
      password_confirmation: pw
    )
    record.save!
  end
于 2012-11-05T10:04:29.687 回答
0

您可以找到模型有哪些方法,运行 rails 控制台并输入:ModelName.methods.sort

于 2012-11-05T10:13:24.160 回答