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 
.... 

当然,你需要添加错误处理一个不登录的用户,但一般的方法将让你的代码干净,和抽象远离用户标识符的想法用户的数据内容。

相关问题