Rails:有没有一种干法来定义影响嵌套资源/模型的方法?

时间:2012-04-24 00:23:38

标签: ruby-on-rails methods dry nested-resources

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

用户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语句更好的方法来包装稍微不同的比较?

提前致谢!

2 个答案:

答案 0 :(得分: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?如果没有,则做出适当的反应......

答案 1 :(得分:0)

两件事:

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

在列表和项目模型中复制这些内容不会对任何内容产生任何影响,并且它会为您提供一种更简单的方法来查看应用中任何给定对象的属性。

2)你应该看看CanCan。它是一个非常简单和轻量级的授权库,旨在管理与您正在处理的事物的访问。