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?并作出适当的反应,如果它不...

+0

谢谢......那很完美。 – 2012-04-25 00:08:10

+0

不客气:) – andrewdotnich 2012-04-26 00:01:29

两件事情:

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

有了这个在你的名单和项目模式复制是不会伤害任何东西,它会给你一个显著更简单的方法,看看谁在你的应用程序给定对象属于。

2)你应该看看CanCan。这是一个非常简单和轻量级的授权库,旨在调节对事物的访问,就像您正在处理的一样。

+0

我担心增加另一个belongs_to,因为它可能会导致信息可能会脱节(即项目属于一个用户,其列表属于另一个)的情况。它不应该发生,但我不想检查它。 感谢上惨惨的建议。其实我试图为它写出能力规则,但如果我不知道它的话,这个提示肯定会有帮助。这是一个救生员。 感谢您分享您的想法! – 2012-04-25 00:10:19

+0

只是FWIW,你可以很容易地验证,以确保它不'脱节',但我很高兴你找到了你喜欢的解决方案。 – Andrew 2012-04-25 01:54:49