如何在不签署用户的情况下编辑用户的值?

时间:2013-12-17 18:49:08

标签: ruby-on-rails ruby-on-rails-3 session session-variables session-cookies

我想向users添加一个名为points的列,并在不同时间更新它。但是,当我更改“用户”列的值时,“用户”已注销,因为用户的记忆标记已更改,并且与本地存储的标记不匹配。

每次更新控制器中的列时,我都可以手动登录用户,但是如果可能的话我想避免这种情况(并且能够从模型更新)。有没有办法可以在不签出用户的情况下更新用户?

3 个答案:

答案 0 :(得分:1)

我不知道您正在使用哪种身份验证系统,但只是更改架构或更新用户的属性并不需要用户再次登录大多数常见的rails auth系统(Devise,Authlogic等等)

答案 1 :(得分:0)

我意识到问题是每当保存用户时,都会使用before_save回调生成新令牌。所以有两种方法可以解决这个问题:

  1. 将before_save更改为before_create。
  2. 用户update_column更新列而不调用before_save回调。

答案 2 :(得分:0)

最简单的方法是将@user.id存储在会话变量中,而不是整个User对象中。使用这种方法,即使在编辑之后,您也会保留一个可以参考的稳定id字段。

这有一些好处:

  1. 它更安全。 Rails会话难以篡改,但易于阅读。因此,您现在不必担心会话cookie中的任何安全或半安全数据会因嵌入整个用户而泄露
  2. 整个对象可能很大。每个请求都有一个序列化的User对象,无缘无故地来回传递。
  3. 将它连接到应用程序控制器很容易,因此使用id而不是真正的用户对象是透明的。

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

    当然,您将为未登录的用户添加错误处理,但这种通用方法将保持您的代码清洁,并从用户标识符的概念中抽象出用户的数据内容。