Rails:是否有一种干净的方式来定义影响嵌套资源/模型的方法?
只是想知道是否有更好的方法来做到以下几点:Rails:是否有一种干净的方式来定义影响嵌套资源/模型的方法?
用户的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
我不想因为在访问列表和项目为user_id属性其实只是依赖于项目。
是否有更好的方法来做到这一点比用switch语句来包裹各地略有不同,比较呢?
在此先感谢!
也许一个简单的方法来做到这一点是定义一个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)鉴于你的情况,我会考虑在列表和项目加入belongs_to :user
,因为它看起来像他们只能属于一个用户。
有了这个在你的名单和项目模式复制是不会伤害任何东西,它会给你一个显著更简单的方法,看看谁在你的应用程序给定对象属于。
2)你应该看看CanCan。这是一个非常简单和轻量级的授权库,旨在调节对事物的访问,就像您正在处理的一样。
我担心增加另一个belongs_to,因为它可能会导致信息可能会脱节(即项目属于一个用户,其列表属于另一个)的情况。它不应该发生,但我不想检查它。 感谢上惨惨的建议。其实我试图为它写出能力规则,但如果我不知道它的话,这个提示肯定会有帮助。这是一个救生员。 感谢您分享您的想法! – 2012-04-25 00:10:19
只是FWIW,你可以很容易地验证,以确保它不'脱节',但我很高兴你找到了你喜欢的解决方案。 – Andrew 2012-04-25 01:54:49
谢谢......那很完美。 – 2012-04-25 00:08:10
不客气:) – andrewdotnich 2012-04-26 00:01:29