4

Я использую aasm (ранее acts_as_state_machine) драгоценный камень в моем приложении 4 рельсов. У меня есть что-то вроде этого на моей Post моделиaasm после обратного вызова с аргументом

... 
    aasm column: :state do 
    state :pending_approval, initial: true 
    state :active 
    state :pending_removal 

    event :accept_approval, :after => Proc.new { |user| binding.pry } do 
     transitions from: :pending_approval, to: :active 
    end 
    end 
    ... 

Когда я называю @post.accept_approval!(:active, current_user) и после обратного вызова сработал, в моей консоли я может проверить, что user есть (который был принят в Proc), и это nil!

Что здесь происходит? Каков правильный способ назвать этот переход?

+0

Почему вы выбрали заброшенный камень? Кстати, переходы вообще не имеют аргументов – apneadiving

+0

Этот драгоценный камень был недавно обновлен, поэтому я не уверен, что вы имеете в виду. Кроме того, их README указывает, что это возможно –

+0

был на другой версии, кажется популярным именем – apneadiving

ответ

1

Он работает в текущей версии (4.3.0):

event :finish do 
    before do |user| 
    # do something with user 
    end 

    transitions from: :active, to: :finished 
end 
3

Посмотрите AASM документы в разделе обратных вызовов.

... 
    aasm column: :state do 
    state :pending_approval, initial: true 
    state :active 
    state :pending_removal 

    after_all_transition :log_all_events 

    event :accept_approval, after: :log_approval do 
     transitions from: :pending_approval, to: :active 
    end 
    end 
    ... 
    del log_all_events(user) 
    logger.debug "aasm #{aasm.current_event} from #{user}" 
    end 

    def log_approval(user) 
    logger.debug "aasm log_aproove from #{user}" 
    end 

Вы можете вызвать события с необходимым Params:

@post.accept_approval! current_user 
0
event :accept_approval do 
    transitions from: :pending_approval, to: :active 
end 

post.accept_approval!{post.set_approvaler(current_user)}

блока грохнуть метод будет назвать после перехода успеха, если какая-либо операция ActiveRecord, это будет обертывание в транзакцию перехода, может потребоваться блокировка для предотвращения проблемы параллелизма с опцией requires_lock: true.

Смежные вопросы