CanCan最佳实践:在创建时自动授予基于数据库的权限

时间:2013-03-19 09:48:33

标签: ruby-on-rails cancan database-permissions

我使用CanCan和Permission模型来管理Folder模型的权限。

当用户创建文件夹时,我想在文件夹上创建为此用户写入的权限(即创建一个权限记录,其中字段action设置为'write',知道此权限可能稍后由管理员修改(用户不是他们创建的文件夹的所有者),属于用户和文件夹)。奇怪的是,如果用户是管理员,则不应创建任何权限。

我可以使用Folder上的回调来完成这项工作,但我不认为直接向模型提供current_user是一个好主意。

以下是我考虑的选项:

  1. 在控制器中进行脏作业。我不喜欢它,它不是DRY
  2. save_and_grant_permission( user, action )上创建一个Folder方法来完成工作,将流程包装在一个事务中。问题是我必须记住总是使用它而不仅仅是save
  3. 所以我想知道:

    • 如果还有其他选择
    • 在这种情况下最佳做法是什么

    更新

    目前,我选择了解决方案2并使用了nested_attributes

    def save_and_grant_permission( user, action )
      return save if user.admin?
      permission = permissions.where( user_id: user.id ).first
      self.permissions_attributes = [
        {id: permission.try(:id), user_id: user.id, action: action.to_s}
      ]
      save
    end
    

    如果没有更好的解决方案出现在这里,我将关闭问题并将其移至StackExchange :: CodeReview。

1 个答案:

答案 0 :(得分:1)

也许您应该以作者的形式为您的文件夹提供对用户的引用。

您可以将权限基于文件夹的作者,例如定义一个after_create回调,为该文件夹的作者创建权限。