if_attribute при декларативной авторизации - PullRequest
7 голосов
/ 13 марта 2010

У меня есть отношения многие ко многим: Пользователь имеет_ множество организаций через аффилированные лица и наоборот.

Я использую декларативные организации, и я хочу, чтобы пользователь редактировал определенную организацию только в том случае, если он является аффилированным лицом, а атрибут affiliationtype для аффилиации имеет определенное значение.

Таким образом, в филиалах есть 3 столбца: user_id, organization_id и affiliationtype_id

Я могу сделать:

o = Organization.find(:first)
o.affiliatons[0].user and get the user

Теперь я хочу сделать это:

has_permission_on [:organizations], :to => :edit do
  if_attribute (...)
end

То, что if_attribute должен видеть, является ли текущий пользователь пользователем organization.affiliation [?]. И является ли organization.affiliation [?]. Affiliationtype_id = "3"

Я надеюсь, что это проблема синтаксиса ... Мне действительно нужно, чтобы это работало.

1 Ответ

7 голосов
/ 14 марта 2010

EDIT:

Вы можете ограничить тип принадлежности с помощью intersects_with (& block) :

  has_permission_on [:organizations], :to => :edit do
    if_attribute :affiliations => intersects_with {
      user.affiliations.with_type_3
    }
  end

Почему бы не создать named_scope для поиска аффилиаций, у которых affiliationtype_id = 3?


Из декларативная_авторизационная документация :

Чтобы уменьшить избыточность в блоках has_permission_on, правило может зависеть от разрешений для связанных объектов:

authorization do
  role :branch_admin do
    has_permission_on :branches, :to => :manage do
      if_attribute :managers => contains {user}
    end

    has_permission_on :employees, :to => :manage do
      if_permitted_to :manage, :branch
      # instead of
      #if_attribute :branch => {:managers => contains {user}}
    end
  end
end
...