2012-03-08 3 views
1

나는 statemachine을 가진 모델을 가지고 있으며 다른 상태/이벤트/전환을 다른 사용자들에게 국한시키고 싶다.모델에서 cancan을 사용할 수 있습니까?

이 모델에서 현재 사용자와 능력에 액세스하려면 어떻게해야합니까?

+0

나는 빨간색을 가지고있다. http://stackoverflow.com/questions/3293400/access-cancans-can-method-from-a-model 그러나 어떻게 사용자를 얻는 지 이해할 수 없다. (user.can? (: update, @ article))를 모델 – tonymarschall

+1

에 삽입 http://stackoverflow.com/questions/1568218/access-to-current-user-from-within-a-model-in-ruby-on-rails? 사용자를 모델로 전달하는 것은 합리적입니다. 현재 액세스하는 것은 아마도 안티 패턴 일 것입니다. – Jonah

답변

2

모델에서 제공하는 모든 방법에 대해 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." 

+0

좋아요! 오늘 오후에 시험 할거야. 사용자가 선택할 수있는 선택 항목에서 하우투 제한 이벤트에 대한 힌트를 줄 수 있습니까? 현재 가능한 모든 이벤트를 가져 오기 위해 @ item.state_transitions을 사용하고 있습니다. – tonymarschall

+0

아마도 역할이 할 수있는 전환을 정의한 다음 사용자가 할당 한 역할을 통해 전환을 찾을 수 있습니다. – Jon

관련 문제