2013-08-22 147 views
1

我对Rails应用程序在我的Ruby的一个辅助模块,和辅助(ApplicationHelper有一个名为is_same_user?的方法,它是像这样定义:Ruby on Rails的助手缓存评估值

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助手缓存?这是我可以得出的唯一可能的结论。我很难追查这可能是什么,任何帮助将不胜感激。

+0

你有没有为这个帮助器方法编写任何测试或规范? –

+0

不,我没有,但是我已经在一系列不同的条件下手动测试了它。 –

回答

2

我认为逻辑这里失败了一点。 我假设你想检查用户是不是零,用户登录和current_user.username是eqal用户或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) 
2

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

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

赔率是你假设应该在任何时候都存在的东西,是不是有...

很难调试像一个大的语句。当你需要弄明白的时候,把它分开!下面是一个(未经测试)绝对可怕为了洞察方式:

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 
0

正如@迈克尔杜达指出,这是一个的引起你的错误运算符优先级,但错误是把太多的副作用一行代码很多。

这可以通过使用guard clauses得到改善(和作出正确的):

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 

此外,代替测试是否用户名用户,我们测试它江湖医生像用户。