2012-11-05 33 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