管理员更改用户的批准状态 - 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 的任何新用户都能赢有同样的问题。
假设 Devise
在 User
模型上。
确保您的 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
模型和更改路线、覆盖模型等的说明。
老实说,我的最终解决方案不需要这些。希望这对您有所帮助!
我按照这个 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 的任何新用户都能赢有同样的问题。
假设 Devise
在 User
模型上。
确保您的 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
模型和更改路线、覆盖模型等的说明。
老实说,我的最终解决方案不需要这些。希望这对您有所帮助!