2014-05-20 29 views
1

我在我的控制器中使用attr_accessor來存儲在applicationController中定義的方法中設置的權限,但我遇到了問題。 如果我這樣做:attr_accessor控制器中存儲權限

class ApplicationController < ActionController::Base 

    attr_accessor :perms 

    def self.set_permissions *permissions 
     self.perms = permissions 
    end 

    def check_permissions 
     print self.perms 
    end 

end 

然後軌是perms=不存在

索賠,如果我做的:

class ApplicationController < ActionController::Base 

    attr_accessor :perms 

    def self.set_permissions *permissions 
     @perms = permissions 
    end 

    def check_permissions 
     print @perms 
    end 
end 

@permscheck_permissions在任何子控制器nil,我查有什麼實例方法可用:print self.instance_variables@perms沒有出現;可能是因爲正在爲類實例設置@perms而不是在調用動作時創建的控制器的對象實例

發生了什麼事?控制器上的導軌不像attr_accessor?我怎樣才能得到這個工作,所以我可以在類中設置權限,讓他們接觸到這個類的任何對象,所以我可以將它們像這樣:

class Api::ApiController < ApplicationController 

    set_permissions :api 
    before_action :check_permissions, except: :set_permissions 

end 

我不得不使用self.set_permissions,否則它聲稱,當我嘗試設置它們時,set_permissions不存在(因爲它是一種對象方法而不是類方法)

編輯: 爲了說明起見,我希望在控制器中設置權限(但對於每個控制器不同) ;對於該控制器的任何實例(即爲一個操作創建的對象實例)或從該控制器繼承的任何控制器(例如節點控制器從api控制器繼承,因此使用相同的權限),除非它已在該繼承控制器中分別定義(令牌控制器從api控制器繼承,但需要是免費的,因此一個人可以在不需要權限的情況下獲得令牌)。

回答

2

您正在定義

def self.set_permissions *permissions 
    self.perms = permissions 
end 

這是一個一流水平的方法,而attr_accessor是在實例級別。

如果您希望設置班級權限,建議您使用cattr_accessor。請檢查它的instance_readerinstance_writer選項。

+1

嗯,剛試過它,它的工作,非常感謝。 – Thermatix