Ruby on rails “if”运算符在回答为“nil”时返回错误

Ruby on rails “if”运算符在回答为“nil”时返回错误,ruby-on-rails,ruby,Ruby On Rails,Ruby,我有一个if声明: <% if current_user.moderator? || user_is_authorized_for_topics? %> 我明白;如果我运行版主?对于没有角色或来宾的用户(在本例中也是),它将返回nil 简言之:我认为问题在于它报告的是零,而不是真或假。但为什么它不跳过这个if语句,当它作为除true之外的任何东西返回时呢?我知道零不是假的,但它也不是真的 希望有人能告诉我这个问题的原因,然后也许我能找出一个解决办法,或者也许有人能直接帮助我解决这个

我有一个if声明:

<% if current_user.moderator? || user_is_authorized_for_topics? %>
我明白;如果我运行版主?对于没有角色或来宾的用户(在本例中也是),它将返回nil

简言之:我认为问题在于它报告的是零,而不是真或假。但为什么它不跳过这个if语句,当它作为除true之外的任何东西返回时呢?我知道零不是假的,但它也不是真的


希望有人能告诉我这个问题的原因,然后也许我能找出一个解决办法,或者也许有人能直接帮助我解决这个错误?调解人只需呼叫枚举管理员、成员、版主

当您没有当前\u用户时,会出现该错误。函数current_user返回Nil,您询问Nil它是否是版主。错误消息表示您不能这样做

还不清楚是什么提供了用户为主题授权的方法?。它可能应该是用户对象,但您不是这样调用它,而是调用一个全局方法或助手。在我的回答中,我假设这个方法在用户对象上,它应该在哪里

相反,您可能希望这样做,首先检查您是否有当前的\u用户:

<% if current_user and current_user.moderator? || current_user.is_authorized_for_topics? %>

请注意,我故意将低优先级和| |高优先级混合在一起。这不是一种适合每个人的风格,但我喜欢它。

只需将其更改为此,这将确保首先有一个用户:

<% if current_user && (current_user.moderator? || user_is_authorized_for_topics?) %>

问题是当前用户是nil,您试图调用nil valueRight上的方法,所以我理解为什么会发生错误。也许我需要更多关于“如果”如何工作的研究。对我来说,当谈到“如果”时,nil应该类似于-除了true之外的任何东西,对吗?你并没有达到“如果”的程度。如果没有主持人,你在做什么?它打电话给主持人失败了?不,不是因为你是主持人?在没有角色的用户上。是因为你是主持人?你的假设是正确的,它来自一个用户控制器。你的代码工作得很好。我甚至没有想过让它识别当前的用户,然后测试他们的角色。非常感谢,这比我想象的容易多了。我需要进一步研究它的原因。我理解你的解释,但我想我还是不明白为什么没有主持人?不会返回“false”。这是nil的文档,nil是NilClass的单例实例。你看到主持人的定义了吗?方法在那里?
<% if current_user && (current_user.moderator? || user_is_authorized_for_topics?) %>