【Ruby on Rails全栈课程】3.8 权限管理之超级管理员审批功能实现

简介: Rails提供一个叫做cancan的权限管理的插件,可以用来做权限控制,不过我们项目的权限管理不通过这个gem插件实现,通过控制用户角色字段来控制权限,这样灵活性比较大。

Rails提供一个叫做cancan的权限管理的插件,可以用来做权限控制,不过我们项目的权限管理不通过这个gem插件实现,通过控制用户角色字段来控制权限,这样灵活性比较大。


1、功能描述


(1)普通用户:可以发布帖子、删除自己发的帖子、发布评论、删除自己发的评论


(2)管理员:注册后不能直接登录,需要超级管理员审批后才可以登录。可以发布帖子、删除普通用户的帖子,发布评论,删除普通用户的评论,置顶、加精帖子。拥有普通用户的权限


(3)超级管理员:审批通过管理员注册申请。


2、超级管理员审批功能实现


超级管理员是最高级的一个账号,管理员账号注册默认是未激活状态,需要超级管理员进行激活才可以使用。


审批功能实现的本质是将管理员(Account表中role字段为1的数据)的status字段由1改成0。是对Account表的操作,所以我们继续在accounts_controller.rb中添加action方法来实现这个功能。


(1)完善app/assets/stylesheets/accounts.scss文件,在后面添加上下列代码:


.active_table{
  width: 100%;
  font-size: 15px;
  margin-top: 30px;
  padding: 8px 8px;
  border-collapse: collapse;
}


(2)在accounts_controller.rb文件中添加account_active方法


#超级管理员激活管理员账户页面
def account_active
  #查出所有管理员账号
  @accounts = Account.where(role:1)
end


(3)在app/views/accounts文件夹下创建account_active.html.erb文件。并且添加下列代码


<div class="container">
  <table class="active_table" border="1px" style="">
  <tr>
    <th>用户名称</th>
    <th>用户邮箱</th>
    <th>账户状态</th>
  </tr>
  <!--循环@accounts对象集合,里面有所有的管理人账号-->
  <% @accounts.each do |account| %>
    <tr>
      <td width="30%" ><%= account.name %></td>
      <td width="40%"><%= account.email %></td>
      <% if account.status == 1 %>
        <!--如果账户为未激活状态,放在<a>标签内-->
        <td width="30%" class="name"><a href="#">未激活</a></td>
      <% else %>
        <td width="30%">已激活</td>
      <% end %>
    </tr>
  <% end %>
  </table>
</div>


(4)在routes.rb文件中添加路由,对应显示account_active.html.erb文件里面的内容


get 'account_active' => 'accounts#account_active'


(5)编辑views/layouts/application.html.erb文件,加上/account_active链接。这样我们在网站头部点击「管理员账户激活」链接,就能进入到审批页面


<!--原代码-->
<li><%= link_to "管理员账户激活", "#" %></li>
<!--改为-->
<li><%= link_to "管理员账户激活", "/account_active" %></li>


(6)rails s启动项目,注册几条管理员的账号,注册并登陆超级管理员账号,点击网站头部「管理员账户激活」链接,会看到以下效果:


image.png


(7)点击未激活链接,对应的管理员账号会被激活,并显示为已激活


A、在routes.rb文件中添加路由,用来提交params哈希里面的值


get 'update_active/:account_id' => 'accounts#update_active'


B、修改account_active.html.erb文件,添加/update_active/:account_id链接


<!--原代码-->
<td width="30%" class="name"><a href="#">未激活</a></td>
<!--改为-->
<td width="30%" class="name"><a href="/update_active/<%= account.id %>">未激活</a></td>


C、在accounts_controller.rb中添加account_active方法,将对应管理人改成激活状态


#改变激活状态
def update_active
  #取出params哈希中的account_id参数
  account_id = params[:account_id]
  #查找出account_id对应的Account对象
  account = Account.find(account_id)
  #将状态修改成已激活
  account.status = 0
  account.save
  #修改完则直接跳转到account_active页面
  redirect_to :account_active
end


代码解析:


account = Account.find(account_id)


我们再3.2章中介绍过find方法,如果括号中的id对应的对象不存在,就会报错,所有我们基本不会使用find方法。我们现在直接使用是因为account_id对应的对象是肯定存在的,不然不会出现在http://192.168.33.10:3000/account_active页面上,我们在该页面上点击某个管理人后面的未激活链接,update_active/:account_id路由会将该管理人的id传递给controller中的update_active方法。所以我们能保证account_id对应的对象是肯定存在的,可以直接使用find方法


到现在为止,超级管理员审批功能已经实现了。其他权限控制我们在做相关功能时会介绍。



目录
相关文章
|
5月前
|
前端开发 JavaScript 数据库
前端学Ruby:全栈论坛(地宫)项目一
前端学Ruby:全栈论坛(地宫)项目一
42 0
|
4月前
|
缓存 关系型数据库 数据库
上云一年烧320万美元,成功“下云”六个月后Ruby on Rails之父现身回了 14 个问题!...
上云一年烧320万美元,成功“下云”六个月后Ruby on Rails之父现身回了 14 个问题!...
25 1
|
5月前
|
存储 前端开发 JavaScript
前端学Ruby:全栈论坛(地宫)项目二
前端学Ruby:全栈论坛(地宫)项目二
23 0
|
5月前
|
SQL 前端开发 数据库
前端学 Ruby:熟悉Rails
前端学 Ruby:熟悉Rails
164 0
|
5月前
|
前端开发 Linux 数据库
前端学 Ruby:安装Ruby、Rails
前端学 Ruby:安装Ruby、Rails
74 0
|
7月前
|
Java Linux 应用服务中间件
在 Ruby on Rails 应用程序中重用 Java 代码
在 Ruby on Rails 应用程序中重用 Java 代码
|
9月前
|
存储 前端开发 关系型数据库
Ruby on Rails 快速入门2
Ruby on Rails 快速入门2
126 0
|
9月前
|
移动开发 前端开发 关系型数据库
Ruby on Rails 快速入门1
Ruby on Rails 快速入门1
82 0
|
2月前
|
Ruby
|
1月前
|
数据采集 Web App开发 数据处理
Ruby网络爬虫教程:从入门到精通下载图片
Ruby网络爬虫教程:从入门到精通下载图片