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

时间:2017-09-16 21:52:04

标签: ruby-on-rails devise cancan

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

2个问题 - 1)当我以管理员身份登录并通过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

1 个答案:

答案 0 :(得分:0)

我花了很多时间试图解决这个问题并且没有在网上找到任何明确的,端到端的完整示例,因此我将所有内容放在首位以便所有新用户都希望获得RoR / Devise #39; t有同样的问题。

假设Devise模型上有User。 确保您的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

按照here

中的步骤操作

他提到只有管理员才能访问&#39;页。如果有人不确定如何做到这一点:

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)使用:               &lt;%= User.approved%&gt;
              

          <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方法。

我知道一些在线链接提供了创建Registrations模型和更改路线,覆盖模型等的说明。

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