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?
pourrait vous montrer s'il vous plaît méthode 'index'? – idej
Que montre le journal? – Marcus
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