【问题标题】:Admin Change Approval Status of User - Rails + Devise + Cancancan管理员更改用户的批准状态 - Rails + Devise + Cancancan
【发布时间】:2017-09-16 21:52:03
【问题描述】:

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

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

【问题讨论】:

    标签: ruby-on-rails devise cancan


    【解决方案1】:

    我花了很多时间试图解决这个问题,但没有在网上找到任何明确的、端到端的完整示例,所以我将所有内容都放在下面,这样任何新的 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中的步骤进行操作

    他提到有一个“仅限管理员访问”页面。如果有人不确定如何执行此操作:

    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) 替换为:

              <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 模型和更改路线、覆盖模型等的说明。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多