1

J'ai une organisation qui affiliations has_many et une mission que has_one Organisationdeclarative_authorization permission sur les nouvelles mais connexes id objet est nul

je peux faire ceci:

m = Mission.first 
m.organization.affiliations 

Un utilisateur aussi affiliations has_many donc je peut faire:

u = User.first 
u.affiliations 

Dans declarative_authorization Je veux qu'un utilisateur soit en mesure de gérer une mission s'il est affilié à l'organisation de la mission. J'ai ceci:

has_permission_on :missions, :to => [:manage] do 
    if_attribute :organization => { :affiliations => intersects_with { user.affiliates.type_admin } } 
end 

Mais je reçois cette erreur:

Permission denied: new not allowed for #<User id: 2, firstname: "Miguel", lastname: "Alho", email: "[email protected]", birthday: "2010-07-05 20:24:00", crypted_password: "...", password_salt: "...", persistence_token: "...", perishable_token: "...", created_at: "2010-03-05 20:25:34", updated_at: "2010-03-30 15:45:36"> on #<Mission id: nil, user_id: nil, organization_id: nil, name: nil, objectives: nil, created_at: nil, updated_at: nil> 

La mission et l'organisation sont nulles. Je pense que c'est parce que sur le nouveau, l'organisation de la mission n'existe pas.

Sur le contrôleur de mission que je présente:

def new 
    if(params[:organization_id]) 
     session[:organization_id] = params[:organization_id] 
     @mission = Organization.find_by_id(params[:organization_id]).missions.build 
    end 
    end 

Répondre

1

Je ne peux pas dire pourquoi votre technique ne fonctionne pas, mais voici comment j'accompli une chose semblable. D'après ce que je comprends dans vos exemples de code, vous voulez seulement que les utilisateurs affiliés à une organisation de mission puissent gérer cette mission. De plus cet utilisateur doit être de type admin. Ce que je l'ai fait dans le passé est créé une relation has_many dans votre modèle d'organisation qui a quelques conditions supplémentaires qui filtrent les affiliations pas de type admin:

has_many :admins, :source => :user, :through => :affiliations, :conditions => "affiliations.type = 'admin'" 

Ensuite, dans votre authorization_rules.rb vous ajoutez dans ce Règle:

has_permission_on :missions, :to => [:manage] do { if_attribute :organization => {:admins => contains {user}}} 
+0

Merci c'était très utile! – jspooner