【问题标题】:Rails: Is there a dry way to define methods that affect nested resources/models?Rails:有没有干的方法来定义影响嵌套资源/模型的方法?
【发布时间】:2012-04-24 00:23:38
【问题描述】:

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

用户有_许多项目

项目 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 语句来环绕略有不同的比较更好的方法?

提前致谢!

【问题讨论】:

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


    【解决方案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)
    

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

    【讨论】:

      【解决方案2】:

      两件事:

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

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

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

      【讨论】:

      • 我担心添加另一个belongs_to,因为它可能会导致信息可能脱节的情况(即项目属于一个用户而其列表中的一个属于另一个)。它不应该发生,但我不想检查它。感谢您对 CanCan 的建议。我实际上是在尝试为它编写能力规则,但如果我不知道这个提示肯定会有所帮助。这真是一个救命稻草。感谢您分享您的想法!
      • 只需 FWIW,您可以相当轻松地验证以确保它不是 disjointed,但我很高兴您找到了您喜欢的解决方案。
      猜你喜欢
      • 2014-08-26
      • 1970-01-01
      • 2016-05-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-02
      相关资源
      最近更新 更多