2013-04-25 84 views
4

我已确认此方法有效。基本上它需要来自控制器的电子邮件并更改特定用户的电子邮件。型号/ ActiveRecord不保存新数据

然而,它从来没有实际保存数据。我传递了一个错误的电子邮件格式,如果我传递了正确的电子邮件方法返回true,则返回false,这意味着它分配了一封新电子邮件并称为“

# Allows user to change email address 
def change_email(newmail) 
    address = EmailVeracity::Address.new(newmail) 

    if address.valid? 
    self.email = newmail 
    self.save 
    return true 
    else 
    return false 
    end 

end 

我首先检查日志任何提示,但没有我得到的是:

Started POST "/members/editmail" for 127.0.0.1 at 2013-04-25 17:33:44 +0200 
Processing by MembersController#editmail as HTML 
    Parameters: {"authenticity_token"=>"*****=", "mail"=>"*****@gmail.com"} 
    ←[1m←[35mUser Load (1.0ms)←[0m SELECT `users`.* FROM `users` WHERE `users`.`id` = 1 LIMIT 1 
    ←[1m←[36mCharacter Load (0.0ms)←[0m ←[1mSELECT `characters`.* FROM `characters` WHERE `characters`.`user_id` = 1←[0m 
    ←[1m←[35m (0.0ms)←[0m BEGIN 
    ←[1m←[36mUser Exists (0.0ms)←[0m ←[1mSELECT 1 FROM `users` WHERE (`users`.`email` = BINARY '*****@gmail.com' AND `users`.`id` != 1) LIMIT 1←[0m 
    ←[1m←[35mUser Exists (0.0ms)←[0m SELECT 1 FROM `users` WHERE (`users`.`username` = BINARY '******' AND `users`.`id` != 1) LIMIT 1 
    ←[1m←[36m (0.0ms)←[0m ←[1mROLLBACK←[0m 
Redirected to http://localhost:3000/members/1 
Completed 302 Found in 10ms (ActiveRecord: 1.0ms) 

而且这有多大意义,要改变这种属性的方法。由于我使用Devise gem进行身份验证,因此我可以使用current_user变量为当前登录的用户检索User对象,然后在控制器中调用current_user.email = newmail; current_user.save

回答

1

self.save!未保存时会抛出异常。

而且,这可能不是正确的:

self.save 
return true 

self.save根据是否保存成功与否返回true或false。所以,你可能想摆脱return true,让返回值是一个从self.save返回不需要在这方面

self关键字,无论是return关键字。所以,这相当于你的代码:

# Allows user to change email address 
def change_email(newmail) 
    address = EmailVeracity::Address.new(newmail) 

    if address.valid? 
    self.email = newmail 
    save 
    true 
    else 
    false 
    end 
end 

这相当于

# Allows user to change email address 
def change_email(newmail) 
    address = EmailVeracity::Address.new(newmail) 

    if address.valid? 
    self.email = newmail 
    save 
    end 
    address.valid? 
end 

这也是你想要什么不应该。

+0

感谢self.save!帮助。似乎在我的Devise User模型中有额外的验证存在错误。 – 2013-04-25 16:27:36

0

看起来更好的方法是将自定义验证添加到用户模型中的电子邮件字段,设置表单以提交用户参数(使用新电子邮件,这里是rails文档可以做到这一点http://guides.rubyonrails.org/form_helpers.html#binding-a-form-to-an-object)并运行类似

if @user.update_attributes(params[:user], :as => :admin) 
    redirect_to @user, :notice => "User updated." 
else 
    render :action => 'edit', :alert => "Unable to update user." 
end 

你在提交操作。