6

J'ai une ressource de groupe que j'essaie de configurer avec les autorisations appropriées.Plusieurs instructions before_filter pour correct_user et admin

La logique d'autorisation que je suis en train de mettre en œuvre est le suivant:

  1. devraient être en mesure d'afficher uniquement les membres du groupe de leur groupe.
  2. Un administrateur peut afficher n'importe quel groupe, ainsi que prendre d'autres actions.

Je tente de le faire avec les déclarations suivantes before_filter dans le contrôleur de groupe:

before_filter :signed_in_user 
before_filter :correct_user, only: :show 
before_filter :admin_user, only: [:show, :index, :edit, :update, :destroy] 

Correct_user fonctionne comme je l'ai vérifié que seuls les membres du groupe peuvent voir leur groupe. Cependant, ce que je veux arriver, c'est que la clause admin: show remplace cette clause, afin qu'un administrateur puisse voir n'importe quel groupe. Actuellement cela ne fonctionne pas. Je suppose que j'ai quelque chose de mal ici avec ma commande de filtre et les options. Est-ce que quelqu'un peut me dire où je me suis trompé?

EDIT

Ajout mon code de la méthode par la demande de Amar:

private 

def correct_user 
    # User has to be a member to view 
    @group = Group.find(params[:id]) 
    redirect_to(root_path) if @group.members.find_by_member_id(current_user).nil? 
end 

def admin_user 
    redirect_to(root_path) unless current_user.admin? 
end 
+0

Essayez admin_user avant le filtre ci-dessus correct_user ou dans l'action d'affichage conditionnel pour l'utilisateur admin et autre – Amar

+0

Merci Amar. J'ai essayé de mettre le filtre admin_user au-dessus de correct_user mais cela ne l'a pas corrigé. Je pourrais mettre la condition dans l'action mais je veux voir s'il y a un moyen de le faire avec before_filter. – pejmanjohn

+0

Une inspection plus approfondie avec la façon dont je l'ai écrit ci-dessus le filtre exige que l'utilisateur soit à la fois et admin ET un utilisateur correct pour voir le groupe. Je veux qu'il soit OU – pejmanjohn

Répondre

2

Mise à jour de la méthode de correct_user ou créer une autre méthode avec la définition suivante, retirez-show d'autre filtre et ajouter before_filter avec une nouvelle méthode .

def correct_user 
    @group = Group.find(params[:id]) 
    redirect_to(root_path) if @group.members.find_by_member_id(current_user).nil? && !current_user.admin? 
end 
+0

Juste testé et cela fonctionne très bien. J'avais besoin d'ajouter un "&&" entre les instructions booléennes. – pejmanjohn

Questions connexes