【问题标题】:Managing different roles using Ruby on Rails使用 Ruby on Rails 管理不同的角色
【发布时间】:2017-02-25 17:17:37
【问题描述】:

我正在使用 Ruby on Rails 编写一个关于无线网络的应用程序。此应用程序由不同的角色组成:管理员、员工和访客。

我的一位同事已经按照 Michael Hartl 的指南制作了访问者部分(基本上 user 已替换为 visitor),现在我必须做休息。

不幸的是,她既没有使用 devise 也没有使用其他类似的宝石,我无法拆除她所有的作品,所以我不能使用它们。

在这个应用程序中,有 MACaddress 或 VLAN 等类,visitor 和employee/admin 都可以对它们进行一些操作,但是这些操作当然是不同的(根据角色不同的权限)。

我的主要问题来了。 考虑这样的事情:

class MacaddressesController < ApplicationController
  before_action :logged_in_visitor, only: [:create, :destroy]
  before_action :correct_visitor,   only: [:destroy,:update]

  def create
    @macaddresses = current_visitor.macaddresses.build(macaddresses_params)
    if @macaddresses.save
      flash[:success] = "mac address created!"
      redirect_to visitor_path(session[:visitor_id],:act => 'mynetwork')
    else
      @macaddresses = current_visitor.macaddresses.all
      @visitor = current_visitor
      render 'visitors/myNetwork'
    end
  end

  def destroy
    @macaddresses.destroy
    redirect_to visitor_path(session[:visitor_id],:act => 'myNetwork',:del=>'true')
  end

  def update
    if @macaddresses.update_attributes(macaddresses_params)
      redirect_to visitor_path(session[:visitor_id],:act => 'myNetwork',:del=>'true')
    else
      @macaddresses = current_visitor.macaddresses.all
      @visitor=current_visitor
      render 'visitors/myNewtork2'
    end
  end

现在...如何根据用户的角色在 MACaddress 或其他类上定义 CRUD 不同的操作?

我什至创建了 _current_employee_,我如何使用它来做我需要的事情?

提前致谢。

【问题讨论】:

  • 如果您的合作伙伴将用户转变为访客,这是否意味着您现在必须为管理员用户创建一个管理员模型,为员工用户创建一个员工模型?
  • 没错,事实上,我创建了 Employee 模型及其控制器、视图等。但是当我必须在其他模型上共同定义 CRUD 操作时,我遇到了问题:例如,在上面的代码中,macaddress 上的 CRUD 操作是使用访问者定义的,但我如何使用员工定义它们?我可以使用 current_employee 来跟踪用户并在这些方法中添加一些 if/else 吗?
  • 您的合作伙伴完全没有展望未来就做出了改变。 User 不应该更改为 Visitor。相反,User 应该添加一个 role 列,这将使角色分支变得微不足道。你可以保留你的伴侣所做的大部分事情,但Visitor 将不得不恢复为User——为了避免承认计划错误而跳过三千个火焰箍是不值得的。

标签: ruby-on-rails roles


【解决方案1】:

如果你是这样嵌套路由:

'/visitors/visitor_id/macaddresses'

你可以像这样获取用户角色类的实例

def find_user_role
  params.each do |name, value|
   next unless name =~ /(.+)_id$/
   user_role_model = $1.classify.constantize rescue nil
   @current_user_role = user_role_model.find(value) if user_role_model
  end
end

那你就可以了

@current_user_role.macaddresses.build(macaddress_params).

您可能还想在 macaddress 模型中将 belongs_to 用户定义为多态关联。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-08-14
    • 2019-04-30
    • 2016-06-21
    • 2011-05-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-14
    相关资源
    最近更新 更多