3

次の問題を解決しようとしています。

class User < ActiveRecord::Base
  belongs_to :department
  has_many :offers
end

class Offer < ActiveRecord::Base
  belongs_to :user
end

class Department < ActiveRecord::Base
  has_many :users
end

ユーザー クラスには、役割の属性があります。:moderator ロールが、:moderator と同じ department.id を持つすべてのユーザーのすべてのオファーを管理できるようにしたいと考えています。これまでのところ、次のことを思いつきました。

class Ability
  include CanCan::Ability

  def initialize(user)
    user ||= User.new # guest user (not logged in)
    if user.is? :admin
      can :manage, :all
    elsif user.is? :moderator
      # Moderators can manage Users which belong to the same Department
      can :manage, User, :department_id => user.department_id
      # Moderators can manage all Offers which share the same department.id as the manager
      can :manage, Offer, :department => { :id => user.department_id}
    elsif user.is? :registered
      # User can manage their own Offers
      can :manage, Offer, :user_id => user.id
    else
      can :read, Offer
    end
  end
end

しかし、ライン

can :manage, Offer, :department => { :id => user.department_id}

必要なオファーだけでなく、すべてのオファーを表示します。行を変更する方法はありますか?多分オファーモデルのスコープですか?

4

2 に答える 2

1

Ju Liuの答えもうまくいきました

has_one :department, :through => :user

オファーモデルに、私の元の定義を使用して

can :manage, Offer, :department => { :id => user.department_id}

トリックを行うようです。

于 2013-06-26T10:03:03.410 に答える
0

このようなものが動作するはずです

can :manage, Offer do |offer|
  offer.user.department == user.department
end
于 2013-06-26T09:47:22.077 に答える