if_attribute de autorização declarativa
-
19-09-2019 - |
Pergunta
Eu tenho um relacionamento muitos-para-muitos como este: A organizações utilizador has_many através de afiliações e vice-versa.
Eu estou usando organizações declarativas e eu só quero que um usuário editar uma determinada organização se ele é filiado eo atributo affiliationtype de filiação é um valor particular.
Assim afiliações tem 3 colunas, user_id, organization_id e affiliationtype_id
posso fazer:
o = Organization.find(:first)
o.affiliatons[0].user and get the user
Agora, eu gostaria de fazer isso:
has_permission_on [:organizations], :to => :edit do
if_attribute (...)
end
Isso if_attribute deve ver se o usuário atual é o organization.affiliation usuário [?]. E se o organization.affiliation [?]. Affiliationtype_id = "3"
Espero que esta é uma questão de sintaxe ... Eu realmente preciso para começar este trabalho.
Solução
EDIT:
Você pode restringir o tipo de afiliação com intersects_with (& bloco) :
has_permission_on [:organizations], :to => :edit do
if_attribute :affiliations => intersects_with {
user.affiliations.with_type_3
}
end
Por que não criar um named_scope para encontrar filiações cuja affiliationtype_id = 3?
De documentação declarative_authorization :
Para reduzir a redundância em blocos has_permission_on, uma regra pode depender de permissões em objetos associados:
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