Вы можете определить способности в канкане против любых методов, предоставляемых моделью.Переходы конечного автомата сами по себе являются методами, предоставляемыми моделью, поэтому просто настройте свои способности так же, как и для любых других методов.
Например, для простой модели:
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."
end