2016-10-25 1 views
3

Je me bats vraiment pour comprendre quelque chose qui est fondamental à l'écriture du code dans les rails. Je ne sais pas ce que c'est de poser une question plus fondamentale, mais je semble avoir des problèmes similaires à plusieurs reprises.Rails 5, Rolify - supprimer le rôle de l'utilisateur

J'ai réussi à installer rolify dans mon application Rails 5. J'utilise rolify pour attribuer des rôles aux utilisateurs.

Maintenant, j'essaye d'installer une fonction pour enlever des rôles des utilisateurs après qu'ils soient assignés.

Dans mon index utilisateur, j'ai;

<% user.roles.each do |role| %> 
    <%= role.name.titleize %> <br> 
<% end %> 

Indique les rôles qui ont été attribués.

Ensuite, Im essayant d'ajouter:

<%= link_to 'Destroy', role, method: :delete, data: { confirm: 'Are you sure?' } %> 

Ma méthode destroy est définie dans mon contrôleur assign_roles. Il a:

def destroy 

    user = User.find(params[:users]) 
    # role = AppRole.find(params[:roles]) 
    assigned_role = user.roles 
    # user_roles = user.roles 
    # organisation = Organisation.first 
    # byebug 

    user.remove_role assigned_role.name, @current_user.organisation 

    flash[:notice] = "Successfully removed" 
    redirect_to action: :index 
    end 

Les itinéraires sont:

resources :users, shallow: true do 
    scope module: :users do 
     resources :assign_roles 
    end 

Il n'y a pas un modèle de assign_role.rb. Je viens d'utiliser un contrôleur et une vue.

Lorsque je tente d'utiliser le lien de rôle détruire dans mon index de l'utilisateur, je reçois une erreur qui dit:

Couldn't find User with 'id'= 

Quelqu'un peut-il voir ce que je dois faire pour obtenir les assign_roles # action destroy au travail?

Mon action de création dans le contrôleur assign_roles fonctionne. Il a:

def create 
    user = User.find(params[:users]) 
    role = AppRole.find(params[:roles]) 
    # organisation = Organisation.first 
    @organisation = Organisation.find(@current_user.organisation) 
    # byebug 

    user.add_role role.display_name, organisation 

    flash[:notice] = "Successfully created" 
    redirect_to action: :index 
    end 

contrôleur complète des rôles Assign:

class Users::AssignRolesController < ApplicationController 

    before_action :authenticate_user! 

    def index 
    # if @current_user.is_admin? 
     @app_roles = AppRole.all 
    # else 
    # @app_roles = AppRole.where(category: relevant_category) 
    # end 

    # if @current_user.is_admin? 
     @users = User.all 
    # else 
     # @users = current_user.organisation.users.select { |u| u.id != current_user.organisation.owner_id } 
    # end 
    end 


    def create 
    user = User.find(params[:users]) 
    role = AppRole.find(params[:roles]) 
    # organisation = Organisation.first 
    @organisation = Organisation.find(@current_user.organisation) 
    # byebug 

    user.add_role role.display_name, organisation 

    flash[:notice] = "Successfully created" 
    redirect_to action: :index 
    end 

    def show 
    # @users = User.joins(:profiles).where('profiles.organisation_id = ?' @current_user.organisation.id) 
    # @users = User.all 
    @current_user.organisation.users 
    end 

    def update 
    end 

    def destroy 

    user = User.find(params[:users]) 
    # role = AppRole.find(params[:roles]) 
    assigned_role = user.roles 
    # user_roles = user.roles 
    # organisation = Organisation.first 
    # byebug 

    user.remove_role assigned_role.name, @current_user.organisation 

    flash[:notice] = "Successfully created" 
    redirect_to action: :index 
    end 

end 

JE FAIRE CE QUE JE VEUX FAIRE DE LA CONSOLE - Je ne peux pas comprendre COMMENT FAIRE DU CODE

Dans la console, je peux écrire:

u.remove_role :fff, Organisation.first 

Cela supprime alors le rôle avec succès.

C'est très bien comme test, mais dans le code j'essaie d'utiliser current_user.organisation au lieu de Organization.first. Mon objectif est de permettre à un utilisateur de gérer les rôles sur sa propre organisation uniquement.

Dans mon contrôleur de rôles d'assignation, j'ai l'action destroy copiée ci-dessus.

Dans mon index des utilisateurs, j'ai une tentative de supprimer le rôle assigné à l'utilisateur comme:

<% user.roles.each do |role| %> 
       <table class="table table-bordered"> 
       <tr> 
       <td><%= role.name.titleize %></td> 
       <td><%= link_to 'Remove role', role, method: :delete, data: { confirm: 'Are you sure?' } %></td> 

L'erreur dit:

undefined method `role_path' for #<# 

Je me demande si je dois donner quelque chose d'autre dans le chemin afin qu'il puisse trouver les rôles assigner # détruire l'action?

Quand je ratisser les routes | assign grep, je peux voir:

DELETE /assign_roles/:id(.:format)            users/assign_roles#destroy 

J'ai essayé de changer le chemin de mes utilisateurs index:

<% user.roles.each do |role| %> 
       <table class="table table-bordered"> 
       <tr> 
       <td><%= role.name.titleize %></td> 
       <td><%= link_to 'Remove role', assign_role_path(user), method: :delete, data: { confirm: 'Are you sure?' } %></td> 
       </tr> 
       </table> 
      <% end %> 

Mais qui donne cette erreur:

Couldn't find User with 'id'= 

Je ne comprendre ce que cette erreur signifie.

Un autre indice

droit, donc je peux voir où le problème se pose. Je suis à court d'idées pour résoudre ce problème.

Dans la console, je peux retirer avec succès un rôle de l'utilisateur dans la façon dont je veux en faisant ceci:

u.remove_role :sdfddd, Organisation.first 
    Organisation Load (2.0ms) SELECT "organisations".* FROM "organisations" ORDER BY "organisations"."id" ASC LIMIT $1 [["LIMIT", 1]] 
    Role Load (0.7ms) SELECT "roles".* FROM "roles" INNER JOIN "users_roles" ON "roles"."id" = "users_roles"."role_id" WHERE "users_roles"."user_id" = $1 AND "roles"."name" = $2 AND "roles"."resource_type" = $3 AND "roles"."resource_id" = $4 [["user_id", 4], ["name", "sdfddd"], ["resource_type", "Organisation"], ["resource_id", 1]] 
    (0.1ms) BEGIN 
    SQL (0.4ms) DELETE FROM "users_roles" WHERE "users_roles"."user_id" = $1 AND "users_roles"."role_id" = 6 [["user_id", 4]] 
    (1.6ms) COMMIT 

Dans le code, mon courant détruire l'action du contrôleur attribuer des rôles, qui dit:

def destroy 

    # user = User.find(params[:users]) 
    user = User.find(params[:id]) 
    # role = AppRole.find(params[:roles]) 
    assigned_role = user.roles 
    # user_roles = user.roles 
    organisation = Organisation.first 
    # organisation = Organisation.find(current_user.organisation) 

    # byebug 

    user.remove_role assigned_role.name, organisation 

    flash[:notice] = "Successfully created" 
    redirect_to root_path 
    end 

montre ce processus dans le journal: paramètre

User Load (1.3ms) SELECT "users".* FROM "users" WHERE "users"."id" = $1 ORDER BY "users"."id" ASC LIMIT $2 [["id", 4], ["LIMIT", 1]] 
    User Load (0.4ms) SELECT "users".* FROM "users" WHERE "users"."id" = $1 LIMIT $2 [["id", 4], ["LIMIT", 1]] 
    Organisation Load (0.7ms) SELECT "organisations".* FROM "organisations" ORDER BY "organisations"."id" ASC LIMIT $1 [["LIMIT", 1]] 
    Role Load (1.0ms) SELECT "roles".* FROM "roles" INNER JOIN "users_roles" ON "roles"."id" = "users_roles"."role_id" WHERE "users_roles"."user_id" = $1 AND "roles"."name" = $2 AND "roles"."resource_type" = $3 AND "roles"."resource_id" = $4 [["user_id", 4], ["name", "Role"], ["resource_type", "Organisation"], ["resource_id", 1]] 

le second est un « Ro le ", où peut-être ce devrait être le nom du rôle (je pense). Le rôle est un nom de table.

Je ne sais pas comment brancher ceci pour que cela fonctionne. Quelqu'un peut-il voir comment je peux traiter le code de la façon dont je peux le faire dans la console?

TENTATIVE PROCHAINE

Ma nouvelle tentative de l'action détruire dans le contrôleur assign_roles a:

def destroy 

    # user = User.find(params[:users]) 
    user = User.find(params[:id]) 
    # role = AppRole.find(params[:roles]) 
    assigned_role = user.roles 
    # user_roles = user.roles 
    # organisation = Organisation.first 
    organisation = Organisation.find(current_user.organisation) 

    # byebug 

    user.remove_role assigned_role, organisation 

    flash[:notice] = "Successfully created" 
    redirect_to root_path 
    end 

Je pense que la ligne problématique est celle-ci:

assigned_role = user.roles 

Il devrait être le rôle spécifique que j'essaie de détruire (à partir du tableau des rôles assignés de l'utilisateur).

Le journal indique:

[["user_id", 4], ["name", "#<Role::ActiveRecord_Associations_CollectionProxy:0x007f887ddb9c98>"], ["resource_type", "Organisation"], ["resource_id", 1]] 

Le rôle ne doit pas être un tableau. Ce devrait être un rôle spécifique.Donc, je pense suivante consiste à essayer d'ajouter le rôle du lien dans mon index des utilisateurs, qui est maintenant:

<%= link_to 'Remove role', assign_role_path(user, role), method: :delete, data: { confirm: 'Are you sure?' } %> 

Ensuite, je besoin d'idées sur la façon dont je peux réécrire la ligne de assigned_role dans mon action destroy afin qu'il sait quel rôle j'essaie de désaffecter de l'utilisateur.

Je n'ai pas de bonnes idées pour faire ça.

# role = AppRole.find(params[:roles]) 
assigned_role = user.role 
# user_roles = user.roles 

Des idées qui pourraient aider à faire avancer cette idée?

+0

pourrait vous montrer s'il vous plaît méthode 'index'? – idej

+0

Que montre le journal? – Marcus

+0

Juste avant 'user = User.find (params [: users])' imprime le hash de params via 'puts params'. Je suppose que vous devriez utiliser 'user = User.find (params [: id])' ou 'user = User.find (params [: user_id])' – Magnuss

Répondre

1

Vous cherchez à détruire le rôle d'un seul utilisateur, n'est-ce pas? Alors

params[:users] 

ne doit pas être au pluriel, et: les utilisateurs ne sont pas une clé valide pour params.

Vous essayez essentiellement à

User.find(nil) 

qui échoue avec

ActiveRecord::RecordNotFound: Couldn't find User with 'id'= 

Vous devriez probablement utiliser

User.find(params[:id]) 
+0

Bonjour Eric. Non, je cherche à supprimer le rôle de l'utilisateur. Je peux assigner des rôles avec les rôles assignés créer une action. Je cherche maintenant comment enlever des rôles assignés des utilisateurs (pas l'utilisateur lui-même) – Mel

+1

Édité, merci. Avez-vous le message d'erreur complet et backtrace? Sur quelle ligne votre code déclenche-t-il une exception? 'Impossible de trouver Utilisateur avec 'id' =' signifierait que votre code ne peut même pas essayer de supprimer un rôle. params [: users] semble toujours inhabituel pour Rails. –