用户

时间:2016-01-31 23:40:10

标签: ruby-on-rails ruby authorization cancan railscasts

所以这是我根据Railscast #386编写的授权码。

问题是该块适用于除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

非常感谢任何帮助:)

1 个答案:

答案 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。