Rails 流水线式的操作,求推荐授权相关的 gem

匿名 · 2013年05月02日 · 最后由 ronbin 回复于 2013年05月05日 · 2822 次阅读

一个在线的购物网站,当一个用户下完订单后。后台先有 A 人员“受理订单”,B 人员根据受理的订单负责“物品准备打包”,C 人员来负责“出库管理”,D 人员来负责“送货”,假设过程到这里结束。

目前,我将一个订单,都关联上一个进度表,例如当这个订单状态为 1 时,A 人员能看到这个订单,然后 A 操作结束后,订单状态将变为 2,同时订单在 A 这里消失,跑到了 B 人员这里。然后到 C,最后到 D。。。

因此,说起来,这个订单状态,A,B,C,D 四个人,都是可以编辑的,任何一个人的编辑,只是,我将其限定成按下 done 之后,自动将订单状态加 1,同时将这个用户 ID 从这个订单状态中清空,到了下一阶段,谁接手了,就将订单状态中的 USER_ID 设置成该人员,以此类推。

我也看了不少授权的 gem,大多都集中在 model 的层面,而在 model 层面,事实上,A,B,C,D 都应该具有 update 的权限,因此,我打算从 controller 层面上面的控制,将 A,B,C,D 四个人各自设立一个 controller,然后各自的 controller 只有各自能访问。这样做起来貌似比较傻。

所以我想请问,是否有那么款 gem 是试用于我的。

gem 'state_machine'

如果一个 controller 来控制的话,每个 user 都需要有自己的 role,然后用 cancan 和 rolify 来搞权限 需要写很多:

user.can :update, Order {|order| order.state == "to_a_only"} if user.role = 'A'
匿名 #2 2013年05月02日

如果有直接根据 controller 的 action 来做限制,那就好了。除了变更状态外,每个人员,还会为此添加上不少额外的信息。

难道你不记录订单的状态变化么?如果记录的话,

你要记录从”受理订单“ -> “物品准备打包”是由谁批准的吧?

如果你知道是谁批准的了,在 state_machine 加个校验不是分分钟的事么

匿名 #4 2013年05月02日

#3 楼 @zhangjinzhu 你是说,还是可以结合 state_machine 和 cancan 来做这个 authorization 吗?

流程差不多下面这样,流程上和 cancan 没有啥关系。。。

class Order
  def 只允许用户A
    self.当前操作用户 == 用户A
  end

  event :物品准备打包 do
    transitions :to => :物品准备打包, :from => [:受理订单], :guard => :只允许用户A
  end
end

state_machine 来管理状态,用 authoritycancan 来控制权限(个人更倾向于前者)

感觉你说的是一个典型的工作流,可以试试: ruote workflow

匿名 #9 2013年05月05日

谢谢各位推荐状态管理的 gem,这个,在以后的开发中,我会将其加入。当前这个我用最原始的方式,已经初步能运行了。

本帖,我原本是想求推荐 authorization 方面的 gem,因为 cancan 以及其它,例如 six,貌似都是建立在 model 上的授权控制,而我想单纯直接在 controller 上做授权控制。

原因是,虽然一个 order 被分割成了多个状态,可各人员,操作的 model 一直是 order,我在想,这样的一种情况,采用 model 上的授权,应当不太合适吧。

#6 楼 @zhangjinzhu guard 这个挺新鲜的。不过好像在 state_machine 的 github 上,找不到一些信息。

需要 登录 后方可回复, 如果你还没有账号请 注册新账号