允许管理员激活或停用用户——Rails

Posted

技术标签:

【中文标题】允许管理员激活或停用用户——Rails【英文标题】:Allow admin to activate or deactivate users-- Rails 【发布时间】:2015-11-01 20:04:24 【问题描述】:

我已经设法制作了一个仅用于注册和登录的应用程序。目前,我允许用户通过邮件帐户激活(按照本教程:https://www.railstutorial.org/book/account_activation_password_reset 和'rails generate controller AccountActivations -- no-test-framework'),但我希望管理员能够激活或停用用户。在我的用户模型中,我设法定义了两种方法:

def activate_account!   
  update_attribute :is_active, true 
end

def deactivate_account!   
  update_attribute :is_active, false 
end

在我的用户部分视图中,我设法

<% if current_user.admin? && !current_user?(user) %> 
  <%= button_to "Deactivate", user, data:  confirm: "Are you sure?"  %> 
<% end %>

我的路线如下所示:

get 'password_resets/new'
get 'password_resets/edit'
root             'static_pages#home'
get 'help'    = 'static_pages#help'
get 'about'   = 'static_pages#about'
get 'contact' = 'static_pages#contact'
get 'signup'  = 'users#new'
get    'login'   = 'sessions#new'
post   'login'   = 'sessions#create'
delete 'logout'  = 'sessions#destroy'
resources :users
resources :account_activations, only: [:edit]
resources :password_resets,     only: [:new, :create, :edit, :update]

问题是我不知道如何进行。我不想使用 Devise 或 CanCan,因为作为初学者,我想知道如何手动操作。请帮助我从应用程序中实现用户的激活和停用(管理员只能这样做)。

Here is my app.

【问题讨论】:

【参考方案1】:

好的,首先阅读 Hartl 的 Rails 教程的 chapters 9 and 10。

向用户添加和管理标志

rails g migration add_admin_to_users admin:boolean

这将为您“免费”提供.admin?,因为 Active Record 将生成此方法。

我会这样写你的按钮

<% if current_user.admin? && @user != current_user %> <%=link_to "deactivate", deactivate_path(user_id: @user), method: :post, data:  confirm: "Are you sure?"  %> <% end %>

然后在你的控制器中:

def deactivate
  user = User.find(params[:user_id])
  if current_user.admin?
    user.deactivate_account!
    redirect_to users_path 
  else
    redirect_to :back
  end
end

在您的路线中,类似:

post "/deactivate", to: "users#deactivate"

无论如何,我给你一个粗略的指导,但请阅读 Hartl 的教程,因为你的用例几乎涵盖了那里。

祝你好运!

【讨论】:

嗨,蔡斯!非常感谢……已经阅读了那些章节……它们很棒!不过还是有问题。尽管如此,我认为这是一个路由问题,因为该应用程序现在具有停用和确认按钮,但无法完成操作。我还将控制器更改为:def deactivate User.find(params[:id]).deactivate flash[:success] = "User deactivated" redirect_to users_url end 并首先定义了before_action :admin_user, only: [:destroy, :deactivate]。有什么问题? 您遇到的错误是什么?如果您可以添加您的错误,我将编辑我的回复以解决它。 在网页上:We're sorry, but something went wrong.。在日志上:...lib/action_dispatch/templates/rescues/routing_error.html.erb within rescues/layout 确实是路由错误。你能分享你更新的路线和链接吗? 在此处粘贴路线:pastie.org/10340895。不确定链接:config/routes.rb?还是应用程序的链接?我还没有合并或推送它。【参考方案2】:

根据 Rails 约定:

PUT is used for updating an existing resource

POST is used for creating a new resource

因此,您应该将此作为PUT 请求而不是POST,因为它正在更新user 记录。

你应该像这样定义你的路线:

put 'deactivate/:id(.:format)', :to => 'users#deactivate', :as => :deactivate_user

并且,在您的user 部分:

<%=link_to "Deactivate", deactivate_user_path(user), method: :put, data:  confirm: "You sure?" %>

现在一切都应该适用于您现有的代码。

【讨论】:

以上是关于允许管理员激活或停用用户——Rails的主要内容,如果未能解决你的问题,请参考以下文章

MacBook 启用或停用 root 用户

Asp.Net Mvc4 WebSecurity 如何激活或停用用户帐户

Rails 应用程序的用户管理访问

Rails:允许用户在注册时选择他们的角色设计

以编程方式停用 Android 中的设备管理员?

在 TFS 2013 中激活迭代的权限