【问题标题】:How can I edit a value of User without signing the User out?如何在不注销用户的情况下编辑用户值?
【发布时间】:2014-01-05 16:40:51
【问题描述】:
我想在users 中添加一个名为points 的列,并在不同时间对其进行更新。但是,当我更改用户列的值时,用户将被注销,因为用户的记住令牌已更改,并且与本地存储的令牌不匹配。
每次更新控制器中的列时,我都可以手动登录用户,但如果可能的话,我想避免这种情况(并且能够从模型更新)。有没有办法在不注销用户的情况下更新用户?
【问题讨论】:
标签:
ruby-on-rails
ruby-on-rails-3
session
session-variables
session-cookies
【解决方案1】:
我不知道您使用的是什么身份验证系统,但只是更改架构或更新用户的属性不需要用户在大多数常见的 Rails 身份验证系统(设计、Authlogic 等)上再次登录
【解决方案2】:
最简单的方法是将@user.id 存储在会话变量中,而不是整个User 对象。使用这种方法,即使在编辑之后,您也会保留一个稳定的 id 字段,您可以参考。
这有几个好处:
- 它更安全。 Rails 会话难以篡改,但易于阅读。因此,您现在不必担心会话 cookie 中的任何安全或半安全数据会因嵌入整个用户而泄露
- 整个对象可能很大。每个请求都有一个序列化的
User 对象,无缘无故地反复来回。
很容易将它连接到您的应用程序控制器中,因此使用id 而不是真正的用户对象是透明的。
class ApplicationController < ActionController::Base
def current_user
User.find(session[:user_id])
end
....
当然,您将为未登录的用户添加错误处理,但这种通用方法将保持您的代码干净,并从用户标识符的概念中抽象出用户的数据内容。
【解决方案3】:
我意识到问题是每当保存用户时都会使用 before_save 回调生成一个新令牌。所以有两种方法可以解决这个问题:
- 将 before_save 更改为 before_create。
- 用户
update_column 在不调用 before_save 回调的情况下更新列。