管理员更改用户的批准状态 - Rails + Devise + Cancancan

Admin Change Approval Status of User - Rails + Devise + Cancancan

我按照这个 link 来了解如何让管理员批准新用户。我的 User 模型有一个 approved 属性,它是一个布尔值。

2 个问题 - 1) 当我以管理员身份登录并通过 link_to "Edit", edit_user_path(user) 转到编辑用户以更改批准的用户 - url 是针对正确的用户,但随后更新操作尝试更新当前管理员用户。

2) 我更愿意覆盖所需的当前密码,所以我在 Registrations 控制器中放置了一个方法来在下面执行此操作,但出现此错误:

错误:unknown attribute 'current_password' for User.

所以它不会覆盖 current_password 也不会更新正确的非管理员用户 - 我哪里错了?

class Ability
      include CanCan::Ability

      def initialize(user)

       current_user ||= User.new # guest user (not logged in)
        if current_user.admin == true
          can :manage, :all
        else
          can :manage, User, id: user.id
        end       
      end
    end

路线

Rails.application.routes.draw do
  devise_for :users, controllers: { registrations: 'registrations' }
  resources :users
end

控制器

class RegistrationsController < Devise::RegistrationsController

  def update_resource(resource, params)
    resource.update_without_password(params) if current_user.admin == true
  end
end

我花了很多时间试图解决这个问题,但没有在网上找到任何明确的、端到端的完整示例,所以我将所有内容都放在下面,希望 RoR/Devise 的任何新用户都能赢有同样的问题。

假设 DeviseUser 模型上。 确保您的 Cancancan 已相应设置。类似于此:

models/ability.rb

class Ability
  include CanCan::Ability

  def initialize(user)
    # Define abilities for the passed in user here. For example:
    #
    current_user ||= User.new # guest user (not logged in)
    if current_user.admin
      can :manage, :all
    else
      can :manage, User, id: user.id
    end
 end
end

按照here

中的步骤操作

他提到有一个 'admin-accessible only' 页面。如果有人不确定如何执行此操作:

class UsersController < ApplicationController
  before_action :admin?, only: :index

  def index
    if params[:approved] == false
      @users = User.where(approved: false)
    else
      @users = User.all
    end
  end

private
  def admin?
    redirect_to '/login' unless current_user.admin == true
  end

end

将此行(我使用 .erb 而不是 .haml,就像他在 link 中所做的那样)%td= link_to "Edit", edit_user_path(user) 替换为: <%= User.approved %>

          <td>
            <% if !User.approved %>
              <%= link_to "Approve User", user_path(:id => user.id, "user[approved]" => true), :method => :patch, class: "btn btn-success" %>
            <% else %>
              <%= link_to "Unapprove User", user_path(:id => user.id, "user[approved]" => false), :method => :patch, class: "btn btn-danger" %>
            <% end %>
          </td>

这实质上为您提供了一个按钮,单击该按钮将批准用户,反之亦然。这里让我困惑了好几天的关键是 a) 你必须确保你的表单(在这种情况下,link_to 命中用户控制器而不是 RegistrationsController#update 方法。

我知道一些在线 link 给出了创建 Registrations 模型和更改路线、覆盖模型等的说明。

老实说,我的最终解决方案不需要这些。希望这对您有所帮助!