2016-08-17 3 views
1

J'utilise Devise et je veux permettre Seuls les administrateurs pour créer de nouveaux utilisateurs. J'ai déjà évalué This mais il a une apparence désuète. J'ai essayé tant de réponses possibles mais rien n'a fonctionné. Je cherche une réponse un peu détaillée car je suis encore un débutant.Comment autoriser seulement les administrateurs à créer de nouveaux utilisateurs?

Les administrateurs sont étiquetés avec une valeur booléenne dans la table des utilisateurs J'essaie de garder les choses minimales.

Répondre

1

Vous pouvez réaliser ceci de nombreuses manières. Ce que j'ai fait dans le passé est une combinaison de montrer \ cacher les liens dans les vues et vérifier l'utilisateur dans le contrôleur. J'ai supposé que vous avez un formulaire avec les détails de l'utilisateur que vous soumettez au contrôleur de l'utilisateur.

J'ai inclus un contrôleur d'une application sur laquelle j'ai travaillé ci-dessous.

La première chose que je fais est de vérifier si l'utilisateur est authentifié (nous utilisons google pour cela, mais si vous avez mis en place concevoir vous n'aurez pas besoin de cela et avez probablement votre propre authentification en place). Devise aura créé l'objet current_user si vous avez ouvert une session qui devrait inclure votre attribut "role". Dans l'utilisateur standard, vous pouvez vérifier le user.role actuel et simplement rediriger si current_user.role n'est pas 1 (je suppose que 1 signifie admin).

class UsersController < ApplicationController 

    # Set the user record before each action 
    before_action :set_user, only: [:show, :edit, :update, :destroy] 

    # User must authenticate to use all actions in the users controller 
    before_filter :authenticate_user! 

    def create 
    if current_user.role = 1 then 
     @user = User.new(user_params) 
     @user.password = Devise.friendly_token[0,20] 

     respond_to do |format| 
     if @user.save 
      format.html { redirect_to @user, notice: 'User was successfully created.' } 
      format.json { render action: 'show', status: :created, location: @user } 
     else 
      format.html { render action: 'new' } 
      format.json { render json: @user.errors, status: :unprocessable_entity } 
     end 
     end 
    else 
     format.html { redirect_to @user, notice: 'You do not have sufficient rights to set up a new user.' } 
    end 
    end 

    private 

    # Use callbacks to share common setup or constraints between actions. 
    def set_user 
    @user = User.find(params[:id]) 

    rescue ActiveRecord::RecordNotFound 
    flash[:notice] = "User record does not exist" 
    redirect_to users_url 
    end 
end 
+0

J'ai ajouté les paramètres de l'utilisateur moi-même, et cela a fonctionné, je pensais que cela hériterait du contrôleur de plan, puis j'ai réalisé que cette classe hérite de la classe de contrôleur d'application. de toute façon merci. mais votre réponse n'est pas encore complète, respond_to manque une balise de fin. éditez-le pour le marquer comme bonne réponse – Opapadaia

1

Eh bien la façon la plus simple de le faire est d'ajouter un before_action à votre contrôleur aux utilisateurs de limiter la créer et éditer et anyother action à des critères spécifiques

before_action :create_user , only: [:edit , :update , :new, :correct_user] 

et vous pouvez définir une méthode de création privée de l'utilisateur

def create_user 

    @user=User.find(params[:id]) 
    redirect_to @user unless @user.criteria == criteria 
    end 

J'espère que c'est ce que vous cherchez. Si non, veuillez commenter avec plus de détails.

+0

mais l'appareil n'a pas de contrôleur utilisateur – Opapadaia

+0

Cela peut vous aider à trouver l'emplacement du contrôleur. http://stackoverflow.com/questions/6234045/how-do-you-access-devise-controllers –

+0

chaque fois que je clique sur le lien_pour créer un nouvel utilisateur, il renvoie un message d'erreur "Vous êtes déjà connecté" – Opapadaia

1
# 
# In Users_Controller 
# 
before_action :check_user_role , only: [:edit , :update , :new, :create] 

def check_user_role 
    redirect_to home_path if current_user.role != "Your Role" 
end 
+0

ne fonctionne toujours pas, il ne cesse de dire "vous êtes déjà connecté" – Opapadaia

+0

Quelle erreur vous obtenez-t-il maintenant? –