2010-12-03 22 views
2

je suit dans mon contrôleur AttachmentRails 3 - CanCan -Définir une autorisation pour créer

def upload 

    @attachment = Attachment.build(:swf_uploaded_data => params[:attachment][:attachment], :user_id => current_user.id, :project_id => params[:space_id]) 
.... 
    end 

Ce que je voudrais de Cancan est de permettre aux utilisateurs de télécharger uniquement à un project_id ils appartiennent. Je confirme le contrôleur obtient les informations correctes, pas nils

Voici mon cancan:

can :upload, Attachment do |attachment| 
    Rails.logger.info 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX- include CanCan::Ability - ATTACHMENT' 
    Rails.logger.info attachment.inspect 
    Rails.logger.info attachment.project 

    current_user.try(:role, attachment.space) 
end 

problème ici, est que l'attachement. est nul, et attachment.project est nul? Comment résolvez-vous ce problème avec CanCan afin que je puisse m'assurer que seuls les membres de l'équipe du projet peuvent télécharger des pièces jointes au projet?

Merci

Répondre

5

Je pense que la meilleure approche pour le faire à un niveau inférieur à la méthode authorize! que l'action du contrôleur.

Alors ...

#AttachmentController 

#Will remove it from cancan 
load_and_authorize_resource :except => [:upload] 

def upload 
@attachment = Attachment.build(:swf_uploaded_data => params[:attachment][:attachment], :user_id => current_user.id, :project_id => params[:space_id]) 
    #add the authorize logic explicitly here when you have the attachment model populated 
    authorize! :upload, @attachment 
end 

Laissez-moi savoir si cela fonctionne pour vous.

0

Par exemple, si vous voulez créer des événements pour permettre à la boucle de courant seulement:

que vous utilisez dans la vue

link.... if can? :create, @loop.events.new 

puis dans le contrôleur

skip_authorize_resource only: [:new, :create] 

... 

def new 
    @event.loop_id = @loop.id 
    authorize! :create, @event 
end 

#similar for create action