Я работаю над машиной событий (перемычкой) в рельсах 4.2, я написал метод с именем send_data
, и когда состояние изменено с ожидаемого до доставки, будет запущено send_data
.Как обрабатывать ошибки в машине событий с использованием переходов gem on rails?
def send_data
data = { 'remote_id' => order.remote_id,
'items' => order.line_items
}
SendLineItemsToWebshop.call(data)
end
SendLineItemsToWebshop
это другой класс, который вызывает метод call
и ждем какого-то ответа, если ответ придет, то событие будет срабатывать (будет изменен), в противном случае, состояние будет таким же.
require 'bunny'
require 'thread'
class SendLineItemsToWebshop
def self.call(data)
conn = Bunny.new(automatically_recover: false)
conn.start
channel = conn.create_channel
response = call_client(channel, data)
channel.queue(ENV['BLISS_RPC_QUEUE_NAME']).pop
channel.close
conn.close
self.response(response)
end
def self.call_client(channel, data)
client = RpcClient.new(channel, ENV['BLISS_RPC_QUEUE_NAME'])
client.call(data)
end
def self.response(response)
return response
JSON.parse response
end
end
Но проблема в том, что, когда событие deliver
называется, он не проверяет ответ send_data
«s приходит или нет, он изменяет состояние. Здесь я доставляю событие:
event :deliver do
transitions :to => :delivered, :from => [:editing, :pending] , on_transition: [ :send_data ]
end
Но я хочу, чтобы, если ответ ложный или нулевой, состояние перехода не будет изменено. Состояние будет изменено только тогда, когда ответ будет выполнен. Пожалуйста, помогите мне в этой проблеме.
Благодаря @MIke K это работает. –