我遵循这个链接来了解如何让一个管理员批准一个新用户。我的User
模型上有一个User
属性,即布尔值。
两个问题-- 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
发布于 2017-09-20 06:03:43
我花了很多时间试图解决这个问题,但没有找到任何确定的、端到端的完整例子,所以我把所有的东西都放在下面,这样任何新的RoR/Devise用户都不会遇到同样的问题。
假设Devise
在User
模型上。确保您的Cancancan是相应设置。与此类似的是:
模型/能力。
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
遵循这里中的步骤
他提到有一个‘只有管理访问’的页面。万一有人不知道该怎么做:
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 %>
<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
模型和更改路由、重写模型等方面的说明。
老实说,我的最后一个解决方案不需要这些。希望这能有所帮助!
https://stackoverflow.com/questions/46258741
复制相似问题