我想添加一列到users
,名为points
,并在不同的时间更新它。但是,当我更改用户列的值时,用户将被注销,因为用户的记忆令牌已更改,并且与本地存储的令牌不匹配。如何在不签署用户的情况下编辑用户的值?
我可以在每次更新控制器中的列时手动登录用户,但是如果可能的话我想避免这种情况(并且能够从模型更新)。有没有办法让我更新用户而无需登录?
我想添加一列到users
,名为points
,并在不同的时间更新它。但是,当我更改用户列的值时,用户将被注销,因为用户的记忆令牌已更改,并且与本地存储的令牌不匹配。如何在不签署用户的情况下编辑用户的值?
我可以在每次更新控制器中的列时手动登录用户,但是如果可能的话我想避免这种情况(并且能够从模型更新)。有没有办法让我更新用户而无需登录?
我意识到问题是一个新的标记是每当用户被保存时用before_save回调生成的。所以有两种方法可以解决此问题:
update_column
更新列而不调用before_save回调。我不知道你使用的是什么认证系统,但只是改变了架构或更新犯规要求用户在重新登录最常见的轨道权威性系统用户的属性(设计,Authlogic,等...)
最容易的事情是将@user.id
存储在您的会话变量中,而不是整个User
对象。采用这种方法,即使在编辑之后,您仍会保留一个可供您参考的稳定的id
字段。
这有几个好处:
User
对象来回无缘无故。将它连接到您的应用程序控制器很容易,因此透明使用id
而不是真正的用户对象。
class ApplicationController < ActionController::Base
def current_user
User.find(session[:user_id])
end
....
当然,你需要添加错误处理一个不登录的用户,但一般的方法将让你的代码干净,和抽象远离用户标识符的想法用户的数据内容。
这不是一个宝石。身份验证与Railscasts和Railstutorial使用的身份验证类似。 http://railscasts.com/episodes/250-authentication-from-scratch http://ruby.railstutorial.org/chapters/sign-in-sign-out – Ari