【问题标题】:Devise current_user weird behavior after upgrade to ruby 1.9.3升级到 ruby​​ 1.9.3 后设计 current_user 奇怪的行为
【发布时间】:2013-07-30 08:12:21
【问题描述】:

我已按项目从 ree-1.8.7 升级到 1.9.2p429。

我的设计模型中有一个名为 silhouette_user_id 的属性。在视图中,偶尔在我的 ruby​​ 代码中,调用

current_user.silhouette_user_id

返回一个不同的(和错误的)值

current_user[:silhouette_user_id]

返回正确的值。

虽然我可以搜索和替换来解决此问题,但我担心其他属性的行为方式相同。这是一个大型项目,我真的需要确定为什么会这样。

任何想法都将不胜感激。

【问题讨论】:

  • “错误”是什么意思。这是出乎意料的身份,其他身份还是什么?没有魔法,所以一定是有原因的。
  • 是的,它返回一个不同的 id。不是完全随机的。来自同一会话的不同用户对象(例如 @user)的 id。哪个 id 因显示的页面而异。例如,在视图中显示 silhouette_user_id=100(例如)作为最后一个用户的用户视图导致 current_user.silhouette_user_id 检索到 100!我想如果我们关注在使用 . notation vs. hash [] notation,它可能会让我有所收获。
  • “来自同一会话的不同用户对象(例如@user)”是什么意思?
  • 为会话中的不同用户记录实例化的用户实例变量(例如@user)。例如,列出 current_user 关注的用户。
  • 我仍然不认为它可能与升级有关,但是如果不阅读代码,将很难调试。

标签: ruby-on-rails devise ruby-1.9.3


【解决方案1】:

我解决了这个问题。在升级期间,我试图更新我为 User 类定义新方法的方式。不幸的是,我做错了。我用过

  def define_new_method(key, value)
    self.class.send(:define_method, key.to_sym) do
       value
    end
  end

这实际上改变了 CLASS 用户的方法,而不是它所针对的实例。改成这样:

  def define_new_method(key, value)
    define_singleton_method key.to_sym, lambda { value }
  end

导致新方法只为预期的实例定义,而不是为 current_user 实例。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多