Non-Null Types

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.

Non-null return types

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).

Non-null error propagation

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.

Non-null argument types

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.