gpt4 book ai didi

ruby-on-rails - Rails 5,Rolify - 从用户中删除角色

转载 作者:数据小太阳 更新时间:2023-10-29 08:07:11 27 4
gpt4 key购买 nike

我真的很难理解在 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 Controller 中定义的。它有:

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 模型。我只使用一个 Controller 和一个 View 。

当我尝试在我的用户索引中使用销毁角色链接时,我收到一条错误消息:

Couldn't find User with 'id'=

谁能看到我需要做什么才能使 assign_roles#destroy 操作生效?

我在 assign_roles Controller 中的创建操作有效。它有:

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

整个分配角色 Controller :

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。我的目标是允许用户仅管理自己组织中的角色。

在我的分配角色 Controller 中,我复制了上面的销毁操作。

在我的用户索引中,我试图从用户中删除分配的角色:

 <% 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 #<#

我想知道我是否需要在路径中给它一些其他东西,以便它可以找到分配角色#destroy 操作?

当我收集路线时 | grep 分配,我可以看到:

 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

在代码中,我当前来自分配角色 Controller 的销毁操作,它说:

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 Controller 中销毁操作的新尝试是:

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?' } %>

然后,我需要一些想法,了解如何在我的销毁操作中重写 assigned_role 行,以便它知道我正试图从用户那里取消分配哪个角色。

我对如何做到这一点没有任何好的想法。

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

有什么想法可以帮助插入这一想法的发展吗?

最佳答案

您只想破坏一个用户的角色,对吗?所以

params[:users]

不应该是复数,并且 :users 不是 params 的有效键。

你基本上是在尝试

User.find(nil)

失败了

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

你可能应该使用

User.find(params[:id])

关于ruby-on-rails - Rails 5,Rolify - 从用户中删除角色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40229414/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com