策略错误:nil:nilClass的未定义方法ID

时间:2014-11-21 01:57:24

标签: ruby-on-rails

我的政策给了我麻烦。我一直收到错误消息

undefined method `id' for nil:NilClass

以下政策:

def update?
    user.present? && current_user.creator?(record, current_user)
end

这是方法user.creator?:

def creator?(wiki, user)
    relationships.find_by(wiki_id: wiki.id, user_id: user.id).creator_created
end

Relationships是一个has_many中的连接表,通过Wikis和Users之间的关系。 Wiki和User都不是nil,关系也不应该是。我刚刚在数据库中播放了包含每个Wiki的Relationships记录。当没有用户时,这个政策工作正常,它只是拒绝我放在下面的任何东西。仅当 用户时,换句话说,当我以用户身份登录时,才会出现此错误。所以我不知道哪个类正在读取为nil,哪个id是个问题。

有什么想法吗?

谢谢!

3 个答案:

答案 0 :(得分:0)

current_user可能在策略中不可用,通常是Devise提供的控制器帮助方法。

答案 1 :(得分:0)

根据您发布的内容,这看起来像Pundit的授权。在Pundit中,current_user不是当前用户,user 当使用authorize方法时传递的当前用户(我假设您已定义)作为用户的策略类中的user,如果不是,则为用户使用已定义的变量。有关详细信息,请阅读Pundit docs

current_user替换为user,您将不会收到该错误。如果您希望通过授权做一些特别的事情,请发表您想要做的评论。

答案 2 :(得分:0)

我认为我在没有关系记录的例子上称这个政策,所以关系是零。我编辑了我的创作者?方法:

def collaborator?(wiki, user)
    if Relationship.exists?(:wiki_id =>wiki.id, :user_id => user.id)
        true
    else
        false
    end
end

这似乎有所帮助。感谢您的投入!