【问题标题】: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 字段,您可以参考。

    这有几个好处:

    1. 它更安全。 Rails 会话难以篡改,但易于阅读。因此,您现在不必担心会话 cookie 中的任何安全或半安全数据会因嵌入整个用户而泄露
    2. 整个对象可能很大。每个请求都有一个序列化的User 对象,无缘无故地反复来回。

    很容易将它连接到您的应用程序控制器中,因此使用id 而不是真正的用户对象是透明的。

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

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

    【讨论】:

      【解决方案3】:

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

      1. 将 before_save 更改为 before_create。
      2. 用户update_column 在不调用 before_save 回调的情况下更新列。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-12-24
        • 1970-01-01
        • 1970-01-01
        • 2021-06-22
        • 2015-10-14
        • 2015-10-26
        • 1970-01-01
        • 2013-10-28
        相关资源
        最近更新 更多