0

我想添加一列到users,名爲points,並在不同的時間更新它。但是,當我更改用戶列的值時,用戶將被註銷,因爲用戶的記憶令牌已更改,並且與本地存儲的令牌不匹配。如何在不簽署用戶的情況下編輯用戶的值?

我可以在每次更新控制器中的列時手動登錄用戶,但是如果可能的話我想避免這種情況(並且能夠從模型更新)。有沒有辦法讓我更新用戶而無需登錄?

回答

0

我意識到問題是一個新的標記是每當用戶被保存時用before_save回調生成的。所以有兩種方法可以解決此問題:

  1. 將before_save更改爲before_create。
  2. 用戶update_column更新列而不調用before_save回調。
1

我不知道你使用的是什麼認證系統,但只是改變了架構或更新犯規要求用戶在重新登錄最常見的軌道權威性系統用戶的屬性(設計,Authlogic,等...)

+0

這不是一個寶石。身份驗證與Railscasts和Railstutorial使用的身份驗證類似。 http://railscasts.com/episodes/250-authentication-from-scratch http://ruby.railstutorial.org/chapters/sign-in-sign-out – Ari

0

最容易的事情是將@user.id存儲在您的會話變量中,而不是整個User對象。採用這種方法,即使在編輯之後,您仍會保留一個可供您參考的穩定的id字段。

這有幾個好處:

  1. 它更安全。 Rails會話很難篡改,但易於閱讀。因此,您現在不必擔心會話Cookie中的任何安全或半安全數據會通過嵌入整個用戶而泄露。整個對象可能很大。每個請求都有一個序列化的User對象來回無緣無故。

將它連接到您的應用程序控制器很容易,因此透明使用id而不是真正的用戶對象。

class ApplicationController < ActionController::Base 
    def current_user 
     User.find(session[:user_id]) 
    end 
.... 

當然,你需要添加錯誤處理一個不登錄的用戶,但一般的方法將讓你的代碼乾淨,和抽象遠離用戶標識符的想法用戶的數據內容。

相關問題