2012-11-05 65 views
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 

sessions_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在用戶工作模型保存用戶,並在執行到達控制器並通過if語句之前拋出錯誤。所以我想用new! do代替,但得到這個:

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

爲什麼!「創建辦」的工作不是「新做的!」?

(我採取了錯誤的方式來解決這個問題嗎?如果是這樣,什麼其他的解決方案,我可以申請嗎?)

回答

2

我不認爲這是一個new!方法,我只知道create!save!

newbuild只是初始化對象而不保存到db,save確實,create確實初始化和保存。

如果發生錯誤而不是返回錯誤,最後的結果是引發異常。

所以,如果你使用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 
+0

謝謝!爲了答案,但如果我想要「保存」呢?在會話控制器的if語句中?那可能嗎? – alexchenco

+0

我已經在'create!'和'save!'結尾添加了對bang標誌的解釋。 – Ryan

+0

如果你在會話控制器中使用'save!',那麼'else'塊就沒用了。 – Ryan

0

你可以找到什麼方法模型,運行軌道控制檯和類型:ModelName.methods.sort