繁体   English   中英

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

[英]Admin Change Approval Status of User - Rails + Devise + Cancancan

点击了此链接,以了解如何让管理员批准新用户。 我的User模型上有一个approved属性,它是布尔值。

2个问题-1)当我以管理员身份登录并通过link_to "Edit", edit_user_path(user)来更改link_to "Edit", edit_user_path(user)以更改批准的用户时-该网址适用于正确的用户,但更新操作尝试更新当前的管理员用户。

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。 类似于以下内容:

模型/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

请按照这里的步骤

他提到有一个“仅管理员可访问”页面。 如果有人不确定该怎么做:

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) %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命中Users控制器,而不是RegistrationsController#update方法。

我知道一些在线链接给出了创建Registrations模型以及更改路线,覆盖模型等的说明。

老实说,我的最终解决方案不需要任何这些。 希望这可以帮助!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM