0

这可能是一个菜鸟问题,但无论如何我都在问。

所以我正在构建一个人们发布帖子的应用程序。所以它是一个社交网络。

但我不希望人们能够编辑和删除其他人的帖子。

我认为基于角色的系统在这里行不通,因为人们只管理自己的帖子

我在考虑某种 AR 关联,但我不知道这是否可行。

我想要的是这样的app/models/ability.rb

class Ability
  def initialize(user)
    if current_user.username == @post.username
      can :edit, Post
      can :destroy, Post
    end
  end 
end

我将如何去做(假设模型是Userand Post)?

所以基本上我应该做一个用户有帖子,还是用户有并且属于帖子

4

2 回答 2

2

用这个

class Ability
  def initialize(user)
    can [:edit, :destroy], Post do |post|
      post.try(:user) == user
    end
  end 
end
于 2012-11-18T17:27:01.777 回答
0

问题是该类Ability将无权访问@post实例变量。所以我认为Ability.rb你不得不说用户can :manage, Post可以创建、编辑和销毁 Post 对象。然后由您的控制器和模型层来确保它们只能编辑和销毁自己的帖子。

使用 CanCan,您可以load_and_authorize_resource在控制器顶部调用以保护整个事物,但在您的情况下,您PostsController可能需要在操作级别进行保护。例如,调用authorize! :manage, @post、和操作,同时检查以确保、 可以确保人们只能修改自己的帖子。createdestroyeditupdatecurrent_user.username == @post.username

最后,您可能希望用户通过简单地将帖子标记为已删除来“软删除”,而不是实际删除帖子。在这种情况下,您将明确授权创建和编辑帖子,但您不会授权它们实际destroy发布帖子。在您的indexshow操作中,您将确保不显示标记为已删除的帖子。

对于基于角色的系统,您可能需要一组版主或添加另一个管理员。那时您将需要一个基于角色的系统。我几乎总是让我的角色开始,即使它只是拥有adminuser角色。

于 2012-11-18T17:25:18.627 回答