I'm just learning to use this and the thing I can only think of is that :prefix_options is required because that's the way it forms the URL to call.
So the endpoint is something like POST /orders/:order_id/fulfillments.json
:prefix_options => { :order_id => xxxxxxxx } fills in :order_id in the URL.
Bit odd as it should probably take it from the fulfillment.order_id attribute.
I thought i'd place the code i'm using to fulfill an order:
o = ShopifyAPI::Order.find 1234567
f = ShopifyAPI::Fulfillment.new
f.order_id = o.id
f.prefix_options[:order_id] = o.id
f.line_items = o.line_items.map { |item| { id: item.id } }
f.tracking_company = "XXXXXXX"
f.tracking_numbers = [ "ABC111222333XX" ]
f.save
o.close
Seems to work fine for me.
I would have thought that there would have been `#add_fulfillment` similar to `Product#add_metafield`