首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >用户- Rails + Devise + Cancancan的管理更改审批状态

用户- Rails + Devise + Cancancan的管理更改审批状态
EN

Stack Overflow用户
提问于 2017-09-16 21:52:03
回答 1查看 366关注 0票数 0

我遵循这个链接来了解如何让一个管理员批准一个新用户。我的User模型上有一个User属性,即布尔值。

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

2)我希望对所需的当前密码进行重写,因此我在Registrations控制器中放置了一个方法来执行以下操作,但得到了以下错误:

错误:unknown attribute 'current_password' for User.

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

代码语言:javascript
运行
复制
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

路线

代码语言:javascript
运行
复制
Rails.application.routes.draw do
  devise_for :users, controllers: { registrations: 'registrations' }
  resources :users
end

控制器

代码语言:javascript
运行
复制
class RegistrationsController < Devise::RegistrationsController

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

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-09-20 06:03:43

我花了很多时间试图解决这个问题,但没有找到任何确定的、端到端的完整例子,所以我把所有的东西都放在下面,这样任何新的RoR/Devise用户都不会遇到同样的问题。

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

模型/能力。

代码语言:javascript
运行
复制
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

遵循这里中的步骤

他提到有一个‘只有管理访问’的页面。万一有人不知道该怎么做:

代码语言:javascript
运行
复制
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 %>

代码语言:javascript
运行
复制
          <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模型和更改路由、重写模型等方面的说明。

老实说,我的最后一个解决方案不需要这些。希望这能有所帮助!

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46258741

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档