0

次のコードがあります。

user.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

セッションコントローラー.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! doUser モデルでユーザーが保存され、実行がコントローラーに到達して if ステートメントを通過する前にエラーがスローされるため、このコードは機能しません。だから私はnew! do代わりに使用することを考えましたが、これを得ました:

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

「new! do」ではなく「create! do」が機能したのはなぜですか?

(私はこれを解決するために間違ったアプローチを取っていますか?もしそうなら、私が適用できる他の解決策は何ですか?)

4

2 に答える 2

2

方法はないと思いますnew!、私は知っているだけcreate!ですsave!

newデータベースに保存せbuildずにオブジェクトを初期化するだけで、初期化と保存の両方を実行します。savecreate

最後の強打は、エラーが発生した場合に 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 に答える