if_attribute sull'autorizzazione dichiarativa
-
19-09-2019 - |
Domanda
Ho una relazione molti-a-molti in questo modo: Un utente organizzazioni has_many attraverso appartenenze e viceversa.
Sto usando le organizzazioni dichiarative e voglio solo un utente di modificare una particolare organizzazione, se è affiliato e l'attributo affiliationtype di appartenenza è un valore particolare.
Quindi, di carattere ha 3 colonne, user_id, organization_id e affiliationtype_id
che posso fare:
o = Organization.find(:first)
o.affiliatons[0].user and get the user
Ora desidero fare questo:
has_permission_on [:organizations], :to => :edit do
if_attribute (...)
end
Questo if_attribute dovrebbe vedere se l'utente corrente è l'organization.affiliation [?]. Utente e se l'organization.affiliation [?]. Affiliationtype_id = "3"
Spero che questo è un problema di sintassi ... Ho davvero bisogno di ottenere questo lavoro.
Soluzione
Modifica
È possibile limitare il tipo di affiliazione con intersects_with (e blocco) :
has_permission_on [:organizations], :to => :edit do
if_attribute :affiliations => intersects_with {
user.affiliations.with_type_3
}
end
Perché non creare un named_scope per trovare le affiliazioni cui affiliationtype_id = 3?
Da documentazione declarative_authorization :
per ridurre la ridondanza in blocchi has_permission_on, una regola può dipendere da autorizzazioni per gli oggetti associati:
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