This might not be the only place for the "enough_fuel" check to happen, but I definitely think it needs to be here.  There's a couple ways to approach this:

1.  Fly returns soft error.  If there's enough fuel, burn the fuel and return true; if there's not enough fuel, return false.
2.  Fly returns hard error.  If there's enough fuel, burn the fuel.  If there's not, raise an exception.
3.  Split the difference - Ship#fly returns false if there's not enough fuel; Ship#fly! raises an exception.

The way you make this decision is imagining your future use cases.  If you're going to issue the "fly" command only when you're absolutely ready to commit, use the hard-error mode.  If you're going to let players attempt to fly without doing the precursors, use the soft-error mode.  Split the difference only if you can genuinely imagine gaining a benefit from both use cases.