GraphQL’s concept of non-null is expressed in the Schema Definition Language (SDL) with !, for example:
type User {
# This field _always_ returns a String, never returns `null`
handle: String!
# `since:` _must_ be passed a `DateTime` value, it can never be omitted or passed `null`
followers(since: DateTime!): [User!]!
}
In Ruby, this concept is expressed with null: for fields and required: for arguments.
When ! is used for field return types (like handle: String! above), it means that the field will never (and may never) return nil.
To make a field non-null in Ruby, use null: false in the field definition:
# equivalent to `handle: String!` above
field :handle, String, null: false
This means that the field will never be nil (and if it is, it will be removed from the response, as described below).
If a non-null field ever returns nil, then the entire selection will be removed from the response and replaced with nil. If this removal would result in another invalid nil, then it cascades upward, until it reaches the root "data" key. This is to support clients in strongly-typed languages. Any non-null field will never return null, and client developers can depend on that.
When ! is used for arguments (like followers(since: DateTime!) above), it means that the argument is required for the query to execute. Any query which doesn’t have a value for that argument will be rejected immediately.
To make an argument non-null in Ruby, use required: true, for example:
# equivalent to `since: DateTime!` above
argument :since, Types::DateTime, required: true
This means that any query without a value for since: will be rejected.