2016-01-31 43 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。