2012-05-04 42 views
0

在我的應用程序中,我有一個用戶確認過程。當用戶註冊四件事情發生:Ruby on Rails用戶確認不更新參數

  1. 的account_status_id設置爲1(未經證實)
  2. 該用戶是在(現在CURRENT_USER存在)簽署
  3. 生成一個new_account_confirmation_token
  4. 確認電子郵件通過鏈接發送給新用戶,其中包含new_account_confirmation_token

我最初嘗試使用此方法處理確認鏈接。它發現用戶沒有問題,代碼流經update_attributes!方法,但它不更新account_status。從我可以告訴它是由於current_user對象存在的事實,因此用戶Im試圖更新已經「在內存中」。那是對的嗎?

def new_account_confirmation 
    @title = "Account Confirmation" 
    logger.info("User is not logged in") 
    @user = User.find_by_new_account_confirmation_token(params[:confirm_id])  
    if @user 
     @user.update_attributes!(:account_status_id => 2) 
    else 
     redirect_to root_path 
    end 
    end 

我的工作如下。下面的代碼工作,但我想知道爲什麼上面的代碼不起作用。爲什麼不更新account_status?

def new_account_confirmation 
    @title = "Account Confirmation" 
    if current_user 
     logger.info("User is logged in") 
     current_user.update_attributes!(:account_status_id => 2) 
    else 
     logger.info("User is not logged in") 
     @user = User.find_by_new_account_confirmation_token(params[:confirm_id])  
     if @user 
     @user.update_attributes!(:account_status_id => 2) 
     else 
     redirect_to root_path 
     end 
    end 
    end 
+0

您可以確認第一組代碼是否更新數據庫中的行?它看起來正確。但是,是的,我想象因爲current_user在內存中,所以它不會更新。出於好奇,你在會話中序列化整個用戶對象嗎?一般來說,最好只存儲該ID,並根據請求進行查詢,以便始終獲得最新的信息。 – agmcleod

+0

第一種方法不會更新數據庫中的行。我只在會話中存儲user_id,而不是整個current_user對象 – hoitomt

回答

0

即使您的用戶是「在內存中」,如您所說,這是沒有理由不更新。我相信您的更新正在發生,但您只是沒有看到它,因爲current_user未與@user同步。

我不知道你是如何驗證@user沒有被更新,但如果update_attributes!沒有拋出一個錯誤,那麼它被保存。

+0

感謝您的回覆。這是有道理的,但沒有發生。我正在檢查從軌道控制檯的數據庫(重新加載!我能想到刷新它的一切),它不會更新狀態。 @user和current_user是否可能引用兩個單獨的數據實例,並且它們不能正確同步? – hoitomt

+0

從我看到的代碼中可以看出,如果用戶以user1身份登錄,但單擊user2的確認鏈接,那麼他們會不同步。你永遠不會檢查current_user是否等於@user。但很容易檢查 - 在你的代碼運行後,看看'current_user'和'@ user'是什麼。 – Dty