我按照此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
答案 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
模型和更改路线,覆盖模型等的说明。
老实说,我的最终解决方案并不需要这些。希望这有帮助!