2016-01-31 38 views
1

所以這是我根據Railscast #386編寫的授權碼。從頭開始爲用戶提供Railscast授權

問題是,該塊在除user_controller之外的所有控制器上都能正常工作。換句話說,任何用戶都可以對任何其他用戶動作editupdate動作,即使給予它的塊與動作editupdate動作的塊相同。

def initialize(user) 
    allow :users, [:new, :create, :show] 
    allow :sessions, [:new, :create, :destroy] 
    allow :favors, [:index, :show] 
    if user 
     allow :users, [:edit, :update] do |usr| 
     usr.id == user.id 
     end 
     allow :favors, [:new, :create] 
     allow :favors, [:edit, :update] do |favor| 
     favor.user_id == user.id 
     end 
     allow :acceptances, [:create, :update] do |acceptance| 
     !acceptance.has_accepted_acceptance? 
     end 
    end 
    end 

任何幫助,高度讚賞:)

+2

[它在YouTube上可用](https://www.youtube.com/watch?v=GE-4chF3Tu0)適用於沒有RailsCast訂閱的人 –

+0

您是否正在授權「@ user」用戶控制器? –

+0

我在'user_controller'中的'current_resource'方法中傳遞'current_user',它覆蓋'application_controller'中的'current_resource'方法,然後作爲對象傳遞給'Permission'類。問題是,我猜'用戶current_resource'不覆蓋'application_controller' – fardin

回答

0

您已經在(user)傳遞給權限類。通過

if user... do |user|... end

再次調用它,你重新初始化傳入的用戶,使其nil。然後,您嘗試給控制器#操作賦予零用戶權限,在這種情況下,涉及用戶帳戶的任何權限。

Ryan Bates在涉及其他模型的權限中包含塊的原因是模型實例尚未傳遞給權限類。這就是爲什麼你看到以下這些:

allow_action :topics, [:new, :create, :index] 
allow_action :topics, [:edit, :update, :show] do |topic| 
    topic.author_id == user.id 
end 
allow_attr :topic, [:title, :content] 

上面的這一位授予用戶可能或已創建的所有主題的權限。

解決方案取出任何重新初始化(user)然後再試一次。

allow_action :users, [:edit, :update] 
allow_attr :users, [:email, :invite_token, :name, :surname, :password, :password_confirmation] 

注意我已經改名爲allow行動allow_action,按照瑞安的在Railscast建議。我也將allow_param方法重命名爲allow_attr,因爲我們習慣於使用attr_accessible。