2012-04-03 86 views
0

我正在嘗試在我的應用程序中設置一個電子郵件驗證過程,並且我生成一個令牌就好了,並在註冊時向用戶發送電子郵件。但是當我點擊驗證鏈接時,'users_controller/confirm'操作中的if和else語句都會被執行。我被重定向到root_path,但用戶記錄中的兩個字段被修改。當我從rails控制檯運行find_by_token時,它返回預期的用戶。我正在使用mysql,並且想知道是否在查詢中會導致兩者都執行的某種延遲。Rails執行if和else語句

def confirm 
    if User.find_by_token(params[:token]).nil? 
     redirect_to root_path 
    else 
     @user = User.find_by_token(params[:token]) 
     cookies[:auth_token] = @user.auth_token 
     User.skip_callbacks = true 
     @user.update_attribute(:token, "") 
     @user.update_attribute(:confirmed, 1) 
     User.skip_callbacks = false 
     reset_session 
     redirect_to routes_path 
    end 
    end 
+0

這似乎極不可能。我會建議向條件的每個分支添加一些輸出,以便您可以看到哪一個被執行。 – MrTheWalrus 2012-04-03 21:02:16

+0

是這個cut'n'pasted代碼,還是你重新鍵入它? (我只是想知道如果你在真實的代碼中有一個錯字,如果你重新輸入的話,這個錯誤不在這裏) – Pavling 2012-04-03 22:06:00

+0

同意 - 這段代碼應該按預期工作。如果實際的代碼細微差別,請注意調用'redirect_to'不會*停止執行動作 - 您需要在執行之後返回。 – Thilo 2012-04-05 08:13:21

回答

2

您可以過濾使用前檢查和重定向這樣

before_filter :find_user 

    def confirm 
    #your action code 
    end 

    private 
    def find_user 
    @email = User.find_by_token params[:token].to_s 
    redirect_to root_path, notice: 'Your token is wrong!' if @email.nil? 
    end 

這樣,你的動作的代碼將只對有效記錄運行。

+0

這不是問題,但它讓我走上了正軌。 else塊正在執行,並且cookie正在創建,但是一旦令牌由於我所使用的輔助方法而設置爲空白,就會被銷燬。謝謝你的幫助! – petfreshman 2012-04-20 15:14:35