所以这是我根据Railscast #386编写的授权码。
问题是该块适用于除user_controller
之外的所有控制器。换句话说,任何用户都可以对任何其他用户进行edit
和update
操作,即使给定的块与优惠edit
和update
的块相同动作。
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
非常感谢任何帮助:)
答案 0 :(得分:0)
您已经将(user)
传递给权限类。通过再次调用
if user... do |user|... end
您正在重新初始化传入的用户,使其成为nil
。然后,您尝试为控制器#action提供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]
注意我已根据Ryan在Railscast中的建议将allow
操作重命名为allow_action
。我还将allow_param
方法重命名为allow_attr
,因为我们习惯使用attr_accessible。