次のコードがあります。
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! do
User モデルでユーザーが保存され、実行がコントローラーに到達して if ステートメントを通過する前にエラーがスローされるため、このコードは機能しません。だから私はnew! do
代わりに使用することを考えましたが、これを得ました:
undefined method `new!' for #<Class:0xb5aaf04>
「new! do」ではなく「create! do」が機能したのはなぜですか?
(私はこれを解決するために間違ったアプローチを取っていますか?もしそうなら、私が適用できる他の解決策は何ですか?)