2012-01-11 39 views
0

我已经为User类创建了一个Observer(见下文)。我知道before_save方法正在调用,我知道new_record条件正在进入,但新的记录永远不会被保存...我错过了before_save回调的基础吗?什么是防止这个观察者before_save无法正常工作?

控制器中保存的样子(在puts产生的错误计数是零):

def create 
    @user = User.new(params[:user]) 
    if @user.save 
     #UserMailer.registration_confirmation(@user).deliver 
     redirect_to root_url, :notice=>"Signed Up!" 
    else 
     puts @user.errors.count 
     render "new" 
    end 
    end 

class UserObserver < ActiveRecord::Observer 
    observe :user 

    def before_save(user) 
    if user.new_record? 
     puts 'HELLLLLLLLLLP' 
     #todo make a confirmation code generator 
     user.confirmationcode='1234' 
     user.confirmed=false 
    else 
     if user.email_changed? 
     user.confirmationcode='123' 
     user.confirmed=false 
     end 
    end 
    end 

    def after_save(user) 
    if user.confirmed=false 
     UserMailer.confirm_registration(user).deliver 
    end 
    end 

end 

回答

1

在Ruby,方法或块的最后一行的结果被用作它的返回值,并且before_save挂钩可以通过返回false来取消save操作。如果你看,你的if user.new_record?分支的最后一行将返回false。确保你的before_save正在返回一些评估为真的东西,而且你会很好。

+0

Doh ...是的,我忘记了......好的,我会给重构一个镜头。 – Webjedi 2012-01-13 22:43:28

+0

关于风格的主题......使before_save的最后一行与user.valid类似吗?一个可以接受的事情? – Webjedi 2012-01-13 22:48:05

+0

我不认为我曾经看到过这件事,但我想不出有什么理由不能脱离我的头顶。 – Emily 2012-01-13 22:51:29

相关问题