我想向users
添加一个名为points
的列,并在不同时间更新它。但是,当我更改“用户”列的值时,“用户”已注销,因为用户的记忆标记已更改,并且与本地存储的标记不匹配。
每次更新控制器中的列时,我都可以手动登录用户,但是如果可能的话我想避免这种情况(并且能够从模型更新)。有没有办法可以在不签出用户的情况下更新用户?
答案 0 :(得分:1)
我不知道您正在使用哪种身份验证系统,但只是更改架构或更新用户的属性并不需要用户再次登录大多数常见的rails auth系统(Devise,Authlogic等等)
答案 1 :(得分:0)
我意识到问题是每当保存用户时,都会使用before_save回调生成新令牌。所以有两种方法可以解决这个问题:
update_column
更新列而不调用before_save回调。 答案 2 :(得分:0)
最简单的方法是将@user.id
存储在会话变量中,而不是整个User
对象中。使用这种方法,即使在编辑之后,您也会保留一个可以参考的稳定id
字段。
这有一些好处:
User
对象,无缘无故地来回传递。将它连接到应用程序控制器很容易,因此使用id
而不是真正的用户对象是透明的。
class ApplicationController < ActionController::Base
def current_user
User.find(session[:user_id])
end
....
当然,您将为未登录的用户添加错误处理,但这种通用方法将保持您的代码清洁,并从用户标识符的概念中抽象出用户的数据内容。