1

我的 Ruby on Rails 应用程序中有一个助手模块,助手 (ApplicationHelper有一个名为 的方法is_same_user?,它的定义如下:

def is_same_user?(user)
        !user.nil? && user_signed_in? && current_user.username == user.is_a?(User) ? user.username : user
end

当我使用此辅助方法时,该值似乎偶尔发生变化。偶尔它会返回 true 并且只返回 true,偶尔它会正常运行,偶尔它会返回 false 并且只返回 false。我知道失败的不是逻辑,因为我已经换掉了逻辑来代替方法调用,并且它运行得非常好。我知道没有定义另一种方法,因为is_same_user?它可以被调用。

这让我想知道它是否是某种 Ruby on Rails 辅助缓存?这是我能得出的唯一可能的结论。我在追踪这可能是什么方面遇到了很多麻烦,任何帮助将不胜感激。

4

3 回答 3

2

我不认为这里有什么魔法,有一个错误,你只需要找到它。

看起来应该检查给定的“用户”(可能是字符串名称或用户对象)是否与 current_user (设计助手?)用户名相同?

赔率是您假设应该始终存在的东西,不是吗...

像这样的一个大语句很难调试。当你需要弄清楚的时候,分手吧!这是获得一些洞察力的(未经测试的)绝对可怕的方法:

def is_same_user?(user)
  if user.nil?
    # possible breakpoint
    logger.debug("user is nil")
    return false
  end

  unless user_signed_in?
    # possible breakpoint
    logger.debug("no user signed in")
    return false
  end

  logger.debug("#{user.class} given: #{user}")
  if user.is_a?(User)
    # possible breakpoint
    return current_user.username == user.username
  else
    # possible breakpoint
    return current_user.username == user
  end
end
于 2013-08-22T17:40:59.853 回答
2

我认为这个逻辑在这里有点失败。我假设您要检查用户是否不为零,用户是否已登录并且 current_user.username 是否等于用户或 user.username(基于给定的参数)。比缺少括号的问题。

> :a == true ? :a : :b
=> :b
> :a == :a ? :a : :b
=> :a
> :a == (true ? :a : :b)
=> true

所以你必须user.is_a?(User) ? user.username : user用括号括起来:

!user.nil? && user_signed_in? && current_user.username == (user.is_a?(User) ? user.username : user)
于 2013-08-22T17:54:48.333 回答
0

正如@Michael Duda 所指出的,是运算符优先级导致了您的错误,但该错误是在一行中放置过多代码的副作用。

这可以通过使用保护子句来改进(并纠正) :

def is_same_user?(username)
  return false unless username
  return false unless user_signed_in?
  username = username.username if username.respond_to?(:username)
  current_user.username == username
end

此外,我们不是测试用户名是否用户,而是测试它是否用户一样嘎嘎作响。

于 2014-03-12T10:35:32.733 回答