0

Я работаю над машиной событий (перемычкой) в рельсах 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 

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

ответ

1

Драгоценный камень переходов имеет приятную функцию guard. Добавьте простой логический тест, например can_be_delivered?, и попробуйте:

event :deliver do 
    transitions :to => :delivered, :from => [:editing, :pending], guard: [:can_be_delivered?] 
end 
+0

Благодаря @MIke K это работает. –