【问题标题】:Rails 3 CanCan Authorizing Scoped OwnershipRails 3 CanCan 授权范围所有权
【发布时间】:2012-11-19 22:23:30
【问题描述】:

我正在建立一个学校系统,教师可以在其中管理各自学校范围内的教室。

我有以下能力设置来匹配:

class Ability
  include CanCan::Ability

  #define the user ability
  def initialize(user)
    user ||= User.new # guest user (not logged in)    
    if user.has_role? :instructor
      can :manage, Classroom do |classroom|
        classroom.new_record? && classroom.school_id == user.school_id || classroom.instructor == user
      end
    end
  end 

end

理论上,这应该使教师能够管理与教师设置无关的新记录,只要教师和新教室都属于同一所学校。

在我的课堂新动作中,我从父学校构建了教室以适应 @classroom = @school.classrooms.build。这将使用 school_id 初始化新的课堂记录,从而使教师能够管理该记录。但是,在我的教室控制器中,我调用了load_and_authorize_resource,它在建立学校与教室的关系并引发 CanCan 授权异常之前授权教师。

有没有办法解决这个问题?

【问题讨论】:

    标签: ruby-on-rails-3 devise cancan before-filter


    【解决方案1】:

    CanCan 可能是在与学校建立关联之前检查能力。您可以明确地打破创建和管理权限:

    can :create, Classroom
    can :manage, Classroom, instructor_id: user.id
    

    然后在验证中检查该教室是否属于教师所在的学校。

    【讨论】:

    • 当然,我想我的授权有点过分依赖cancan。不过要注意的一件事是语法can :manage, Classroom, instructor == user 似乎不太适用于cancan 1.6.8,我@ 987654324@。但是在教室里工作得很好。
    • 该语法可能仅适用于属性,而不适用于关联 - 尝试编辑后的版本。
    • 不错的尝试,但仍然没有骰子。不过,稍微冗长一点也不是什么大问题。
    • Bleh,我的错。再次修复它 - 它需要条件哈希,而不是布尔表达式。有关详细信息,请参阅wiki 的“条件哈希”部分。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-09
    • 2011-08-15
    • 2013-07-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多