Доходность предметов в AASM после обратного вызова - PullRequest
0 голосов
/ 20 декабря 2018

Можете ли вы сдать предметы в: после обратного вызова?Я получил LocalJumpException, когда я выполняю код ниже

require 'aasm'
class TestClass
  include AASM
  aasm do
    state :created, initial: true
    state :running
    event :run do
      transitions from: :created,
      to: :running,
      after: proc { yield 1 }
    end
  end
end
TestClass.new.run! { |v| puts v }

1 Ответ

0 голосов
/ 20 декабря 2018

Это невозможно из коробки, так как aasm отбрасывает блоки кода, переданные в вызовы событий, но эй, это ruby.

require 'aasm'
class TestClass
  include AASM
  aasm do
    state :created, initial: true
    state :running
    event :run do
      transitions from: :created,
      to: :running,
      after: -> { @λ_run.call(1) if @λ_run } # invoke the code block if was passed
    end
  end
end
TestClass.prepend(Module.new do
  def run!(*args, &λ)
    @λ_run = λ # store the code block passed to the method
    super
  end
end)
TestClass.new.run! { |v| puts v.inspect }

С небольшим количеством метапрограммирования его легко расширитьвсем определенным обработчикам событий.

...