2011-10-07 79 views
2

我正在使用CanCan,并遇到了错误诊断问题。CanCan资源加载问题

一些用户测试我的应用程序已收到NoMethodError: undefined method 'where' for nil:NilClass来自下面指出的行。

在什么情况下,load_and_authorize_resource会在nil那边离开@jobsnil

class JobsController < ApplicationController 
    load_and_authorize_resource 

    def index 
    if Job::STATES.include? params[:state] 
     if params[:state] == 'in_progress' 
     @jobs = @jobs.where(['state = ? or state = ?', params[:state], 'needs_confirmation']) 
     else 
     ################################################### 
     # Error thrown here 
     @jobs = @jobs.where(['state = ?', params[:state]]) 
     ################################################### 
     end 
    end 
    end 

end 

而且培训相关康康舞代码:

if user.role? :employee 
    can :read, Job do |j| 
    (j.employee == user) or (j.employee == nil) 
    end 
end 
+0

你能展示相关的can​​can代码吗? – rdvdijk

+0

用适当的CanCan代码编辑 – Luke

回答

1

你应该做Job.where(...) - 你得到这个错误,因为你确实在实例变量调用where。我个人并不太依赖load_resource,明确表示没有任何伤害。

+1

我正在使用'load_and_authorize_resource',因为它只处理当前用户有权查看的作业。我同意明确表示没有任何伤害,但我不明白为什么助手方法在这种情况下失败。它的目的是设置'@ jobs'变量,所以我不明白为什么它仍然是'nil'。我错过了什么吗? – Luke

+0

你检查了你的授权吗?当前用户可能无法访问该资源,因此它被加载为零。将你的auth设置为'can:manage,:all',看'@ jobs'是否为零。您可能还想根据用户身份验证处理'jobs#index'内部的操作,具体方法请参阅CanCan文档。 –

+0

我认为它与授权有关,因为具有'admin'角色的用户可以:manage,:all'没有这个问题。这只发生在具有CanCan代码中显示的“雇员”角色的用户身上。但是这个角色显然有权读取某些作业,所以我不知道会导致'load_resource'返回'nil'。如果没有匹配的作业,它应该返回一个空数组。 – Luke