Rails 5,Rolify-从用户删除角色 [英] Rails 5, Rolify - removing role from user

查看:111
本文介绍了Rails 5,Rolify-从用户删除角色的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我真的很难理解一些用Rails编写代码的基础知识。我不知道问一个更基本的问题是什么,但是我似乎反复遇到类似的问题。

I am really struggling to understand something that is fundamental to writing code in rails. I don't know what it is to ask a more fundamental question, but i seem to be having similar problems repeatedly.

我已经设法在Rails 5中设置rolify应用程式。我使用rolify来为用户分配角色。

I have managed to setup rolify in my Rails 5 app. I use rolify to assign roles to users.

现在,我正在尝试设置一个函数,以便在分配用户后从用户中删除角色。

Now, I'm trying to setup a function to remove roles from users after they are assigned.

在我的用户索引中;

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

显示已分配的角色。

然后,我试图添加:

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

我的destroy方法在我的assign_roles控制器中定义。它具有:

My destroy method is defined in my assign_roles controller. It has:

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模型。我只使用一个控制器和一个视图。

There isn't an assign_role.rb model. I just use a controller and a view.

当我尝试在用户索引中使用销毁角色链接时,出现错误消息:

When I try to use the destroy role link in my user index, I get an error that says:

Couldn't find User with 'id'=

$ b $的用户b

谁能看到我需要做些什么才能使assign_roles#destroy操作正常工作?

Can anyone see what I need to do to get the assign_roles#destroy action to work?

我在assign_roles控制器中的create操作有效。它具有:

My create action in the assign_roles controller works. It has:

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

我可以从控制台执行我想做的事情-我无法确定如何从代码中做到这一点

在控制台中,我可以编写:

In the console, I can write:

u.remove_role :fff, Organisation.first

然后成功删除角色。

作为测试很好,但是在代码中,我尝试使用current_user.organisation而不是Organisation.first。我的目标是允许用户仅在其自己的组织上管理角色。

This is fine as a test, but in the code I'm trying to use current_user.organisation instead of Organisation.first. My objective is to allow a user to manage roles on its own organisation only.

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

In my assign roles controller, I have the destroy action copied above.

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

In my users index, I have an attempt to delete the assigned role from the user as:

 <% 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 Assign,我可以看到:

When I rake routes | grep assign, I can see:

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

我尝试将用户索引中的路径更改为:

I tried changing the path in my users index to:

<% 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'=

I的用户

另一个线索

对,这样我可以看到问题出在哪里。我不知道如何解决它。

Right, so I can see where the problem arises. I'm out of ideas for how to fix it.

在控制台中,通过执行以下操作,我可以成功删除用户的角色: p>

In the console, I can successfully remove a user's role in the way I want to by doing this:

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 Roles控制器执行的destroy操作如下:

In the code, my current destroy action from the assign roles controller, which says:

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

显示在日志中执行以下过程:

shows this process in the log:

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]]

第二个参数是角色,也许它应该是角色的名称(我认为)。角色是表名。

The second parameter is a "Role", where maybe it should be the name of the role (i think). Role is a table name.

我不确定如何将其插入以使其工作。谁能看到我在控制台中如何获取处理代码的方法?

I'm not sure how to plug this in to make this work. Can anyone see how I can get code to process in the way I can do it in the console?

下一个尝试

我在assign_roles控制器中进行销毁操作的新尝试是:

My new attempt at the destroy action in the assign_roles controller has:

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

应该具体我试图破坏的角色(从使用中r的分配角色数组。)

It should be the specific role that I am trying to destroy (from the user's array of assigned roles).

日志显示:

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

角色不应该是数组。它应该是一个特定的角色。因此,我的下一个猜测是尝试将角色添加到用户索引中的链接中,该链接现在为:

The role shouldn't be an array. It should be a specific role. So, my next guess is to try adding the role to the link in my users index, which is now:

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

然后,我需要有关如何在我的销毁动作中重写assigned_role行的想法,以便它知道我正在尝试从用户取消分配哪个角色。

Then, I need ideas for how I can rewrite the assigned_role line in my destroy action so that it knows which role I am trying to un-assign from the user.

我对此没有任何好的主意。

I don't have any good ideas for how to do that.

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

是否有任何想法可以帮助推动这一想法?

Any ideas that might help push this thought forward?

推荐答案

您正在寻求仅破坏一个用户的角色,对吗?
因此

You are looking to destroy the role for just one User, right? So

params[:users]

不能为复数,并且:users不是有效的params密钥。

shouldn't be plural, and :users isn't a valid key for params.

您基本上是尝试

User.find(nil)

失败

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

您可能应该使用

User.find(params[:id])

这篇关于Rails 5,Rolify-从用户删除角色的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆