【问题标题】:Using Devise with CanCan将设计与 CanCan 一起使用
【发布时间】:2012-11-18 16:52:27
【问题描述】:

这可能是一个菜鸟问题,但我还是要问。

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

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

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

我在考虑某种 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

我该怎么做(假设模型是UserPost)?

所以基本上我应该做一个User has Posts,还是用户拥有并且属于Posts

【问题讨论】:

  • 您实际上遇到了什么问题?你试过吗?另外,您不会将用户与帖子相关联吗?为什么不current_user == @post.user。或@post.owner
  • @IsmaelAbreu 问题是我将如何去做,例如has_many, has_one, has_and_belongs_to_many.

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


【解决方案1】:

使用这个

class Ability
  def initialize(user)
    can [:edit, :destroy], Post do |post|
      post.try(:user) == user
    end
  end 
end

【讨论】:

    【解决方案2】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-02-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-10
      • 1970-01-01
      • 2012-06-08
      • 1970-01-01
      相关资源
      最近更新 更多