Можно ли использовать канкан в модели? - PullRequest
1 голос
/ 08 марта 2012

У меня есть модель с машиной состояний, и я хочу ограничить разные состояния / события / переходы для разных пользователей.

Как я могу получить доступ к текущему пользователю и способностям в этой модели?

1 Ответ

2 голосов
/ 08 марта 2012

Вы можете определить способности в канкане против любых методов, предоставляемых моделью.Переходы конечного автомата сами по себе являются методами, предоставляемыми моделью, поэтому просто настройте свои способности так же, как и для любых других методов.

Например, для простой модели:

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...