2012-01-11 68 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

相關問題