2011-10-07 183 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