0

只是想知道是否有更好的方法来执行以下操作:

用户 has_many 项目

项目 has_many 列表

列出 has_many 项

某些用户只能访问某些项目。但是,如果用户有权访问某个项目,则该用户可以访问属于该项目的所有列表和项目。

这是我要清理的方法:

def check_for_user_access(resource, resource_class, user)
  case resource_class
    when 'Project'
      if resource.user == user
        return true
      end
    when 'List'
      if resource.project.user == user
        return true
      end
    when 'Item'
      if resource.list.project.user == user
        return true
      end
    else
      return false
  end
end

我不想要 List 和 Item 中的 user_id 属性,因为访问实际上只是与 Project 相关联。

有没有比使用 switch 语句来环绕略有不同的比较更好的方法呢?

提前致谢!

4

2 回答 2

1

也许更简单的方法是定义一个allow_access?每个资源类的方法——那么控制器所要做的就是询问资源是否允许用户进入。例如:

class Project < ActiveRecord::Base #I assume
  def allow_access?(user)
    return self.user == user
  end
end

class List < ActiveRecord::Base
  def allow_access?(user)
    return self.project.user == user
  end
end

class Item < ActiveRecord::Base
  def allow_access?(user)
    return self.list.project.user == user
  end
end

并且,可以选择在您的用户模型中放置一个包装器:

class User < ActiveRecord::Base
  def can_access?(resource)
    resource.allow_access?(self)
  end
end

然后你的方法可以替换为

user.can_access?(resource)

如果您想稍微收紧一点,您的用户模型可以检查资源是否响应 allow_access?如果没有,则做出适当的反应……</p>

于 2012-04-24T00:41:55.187 回答
0

两件事情:

1)鉴于您的情况,我会考虑belongs_to :user在列表和项目上添加一个,因为看起来它们只能属于一个用户。

在您的列表和项目模型中复制此内容不会有任何损害,并且它会为您提供一种非常简单的方法来查看应用程序中的任何给定对象属于谁。

2)你应该看看CanCan。这是一个非常简单且轻量级的授权库,旨在规范对您正在处理的事物的访问。

于 2012-04-24T00:40:50.113 回答