I have a 3D ray at the bottom of my player primitive. It's a little hard to see in this picture because it's perfectly aligned with the axis, but there's a small RayCast arrow pointing down.

In my code, I grab a reference to this raycast at startup and then keep checking to see if it's intersecting with something. If it is, I know the object is on the ground. You can do this with the is_colliding() method. Try experimenting with the length of the vector and make sure it's pointing in the right direction. Here's the sample code:
# In init:
onready var down_ray = get_node("DownRay")
func _process(delta):
...
if !down_ray.is_colliding(): # If we are not on the ground:
acceleration.y = gravity # Start falling.
A minor advantage to this is you can change the length of the ray and its position, so you don't have to have your object at the origin of the space. This might be considered a downside, but it's simple to implement on code and it takes advantage of the editor's visuals.