![](/img/trans.png)
[英]Rails 5 - Rolify - trying to remove an instance of a role from a user
[英]Rails 5, Rolify - removing role from user
我真的很难理解在rails中编写代码的基础知识。 我不知道问一个更基本的问题是什么,但我似乎反复遇到类似的问题。
我已经设法在我的Rails 5应用程序中设置rolify。 我使用rolify为用户分配角色。
现在,我正在尝试设置一个功能,以便在分配用户后删除用户的角色。
在我的用户索引中,我有;
<% user.roles.each do |role| %>
<%= role.name.titleize %> <br>
<% end %>
这显示了已分配的角色。
然后,我试图添加:
<%= link_to 'Destroy', role, method: :delete, data: { confirm: 'Are you sure?' } %>
我的destroy方法在我的assign_roles控制器中定义。 它有:
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
路线是:
resources :users, shallow: true do
scope module: :users do
resources :assign_roles
end
没有assign_role.rb模型。 我只是使用控制器和视图。
当我尝试在我的用户索引中使用destroy role链接时,我收到一条错误消息:
Couldn't find User with 'id'=
任何人都可以看到我需要做什么才能使assign_roles#destroy动作起作用?
我在assign_roles控制器中的创建操作有效。 它有:
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
整个分配角色控制器:
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
我可以做我想从控制台做什么 - 我不知道如何从代码中做到这一点
在控制台中,我可以写:
u.remove_role :fff, Organisation.first
然后成功删除该角色。
这可以作为测试,但在代码中我试图使用current_user.organisation而不是Organisation.first。 我的目标是允许用户仅管理自己组织中的角色。
在我的assign roles控制器中,我有上面复制的destroy动作。
在我的用户索引中,我尝试从用户删除指定的角色,如下所示:
<% 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>
错误说:
undefined method `role_path' for #<#
我想知道我是否需要在路径中给它一些其他内容,以便它可以找到赋值角色#dumping action?
当我耙路线| grep assign,我可以看到:
DELETE /assign_roles/:id(.:format) users/assign_roles#destroy
我尝试将用户索引中的路径更改为:
<% 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 %>
但后来出现了这个错误:
Couldn't find User with 'id'=
我不明白这个错误意味着什么。
另一个线索
是的,所以我可以看到问题出现的地方。 我不知道如何修复它。
在控制台中,我可以通过以下方式成功删除用户的角色:
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
在代码中,我从assign角色控制器的当前销毁操作,其中说:
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
在日志中显示此过程:
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]]
第二个参数是“角色”,也许它应该是角色的名称(我认为)。 角色是表名。
我不知道如何插入它来使这项工作。 任何人都可以看到我如何能够以我在控制台中执行的方式处理代码?
下一步尝试
我对assign_roles控制器中的destroy动作的新尝试有:
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
我认为问题在于这一行:
assigned_role = user.roles
它应该是我试图销毁的特定角色(来自用户的指定角色数组)。
日志显示:
[["user_id", 4], ["name", "#<Role::ActiveRecord_Associations_CollectionProxy:0x007f887ddb9c98>"], ["resource_type", "Organisation"], ["resource_id", 1]]
该角色不应该是一个数组。 它应该是一个特定的角色。 所以,我的下一个猜测是尝试将角色添加到我的用户索引中的链接,现在是:
<%= link_to 'Remove role', assign_role_path(user, role), method: :delete, data: { confirm: 'Are you sure?' } %>
然后,我需要有关如何在destroy操作中重写assigned_role行的想法,以便它知道我试图从用户取消分配的角色。
我对如何做到这一点没有任何好的想法。
# role = AppRole.find(params[:roles])
assigned_role = user.role
# user_roles = user.roles
任何可能有助于推动这一思想的想法?
你想要破坏一个用户的角色,对吧? 所以
params[:users]
不应该是复数,并且:用户不是params的有效密钥。
你基本上是想要
User.find(nil)
失败了
ActiveRecord::RecordNotFound: Couldn't find User with 'id'=
你可能应该使用
User.find(params[:id])
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.