如何使用rails上的过渡gem处理事件机器中的错误?

时间:2016-12-28 12:42:39

标签: ruby-on-rails ruby event-handling transitions state-machine

我正在使用rails 4.2中的事件机器(过渡gem),我编写了一个名为send_data的方法,当状态从挂起更改为交付时,send_data将被触发。

def send_data
    data = { 'remote_id' => order.remote_id,
             'items' => order.line_items
           }
    SendLineItemsToWebshop.call(data)        
  end

SendLineItemsToWebshop是另一个调用call方法并等待某些响应的类,如果响应来了,那么事件将被触发(状态将被更改),否则,状态将是相同的。< / p>

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的响应是否到来,它会改变状态。这是我提供的活动:

event :deliver do
      transitions :to => :delivered, :from => [:editing, :pending] , on_transition: [ :send_data ]
    end

但我希望如果响应为false或nil,则不会更改转换状态。只有在回应成真时才会改变国家。 请帮我解决这个问题。

1 个答案:

答案 0 :(得分:1)

Transitions gem有一个很好的<% if !current_user %> <%= link_to 'Register', new_user_registration_path %> <% end %> 功能。添加一个简单的逻辑测试,如guard,然后尝试:

can_be_delivered?