【问题标题】:Is it possible to use cancan in a model?可以在模型中使用 cancan 吗?
【发布时间】:2012-03-08 21:07:17
【问题描述】:

我有一个带有状态机的模型,我想将不同的状态/事件/转换限制给不同的用户。

如何在这个模型中访问当前用户和能力?

【问题讨论】:

标签: ruby-on-rails model cancan state-machine


【解决方案1】:

您可以在 cancan 中针对模型提供的任何方法定义能力。状态机转换本身就是模型提供的方法,因此只需像设置任何其他方法一样设置您的能力。

例如,给定一个简单的模型:

class Order < ActiveRecord::Base

  state_machine :initial => :new do

    event :start_processing do
      transition :new => :processing
    end

    event :complete_order do
      transition :processing => :complete
    end

    event :escalate_order do
      transition :processing => :escalated
    end

    event :complete_escalated_order
      transition :escalated => :complete
    end

    state :new
    state :processing
    state :escalated
    state :complete
  end

end

你可以这样定义能力:

class Ability

  if user.role? :orderer
    can [:start_processing, :escalate_order, :complete_order], :orders
  end
  if user.role? :manager
    can :complete_escalated_order, :orders
  end

end

编辑 - 我应该补充一下,然后您将在处理用户请求的控制器中使用这些功能:

class OrdersController < ApplicationController

  def complete
    @order = Order.find_by_ref(params[:id])

    if @order.can_complete_order?
      authorize! :complete_order, @order
      @order.complete_order
    elsif @order.can_complete_escalated_order?
      authorize! :complete_escalated_order, @order
      @order.complete_escalated_order
    else
      redirect_to root_url, :notice => "Order cannot be completed"
    end

    redirect_to my_queue_path, :notice => "Order #{@order.ref} has been marked as complete."

结束

【讨论】:

  • 太棒了!今天下午去测试。您能否提供有关如何限制用户可以选择的选择中的事件的提示?目前我正在使用@item.state_transitions 来获取所有可能的事件。
  • 我可能会定义一个角色能够进行哪些转换,然后通过用户分配的角色找到它们。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-03-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-03
  • 1970-01-01
  • 2015-10-09
相关资源
最近更新 更多