⚠ Experimental ⚠
This feature may get big changes in future releases. Check the changelog for update notes.
Directives are system-defined keywords that modify execution. All GraphQL systems have at least two directives, @skip and @include. For example:
query ProfileView($renderingDetailedProfile: Boolean!){
viewer {
handle
# These fields will be included only if the check passes:
... @include(if: $renderingDetailedProfile) {
location
homepageUrl
}
}
}
Here’s how the two built-in directives work:
@skip(if: ...) skips the selection if the if: ... value is truthy (GraphQL::Schema::Directive::Skip)@include(if: ...) includes the selection if the if: ... value is truthy (GraphQL::Schema::Directive::Include)GraphQL-Ruby also supports custom directives for use with the interpreter runtime.
Custom directives extend GraphQL::Schema::Directive:
# app/graphql/directives/my_directive.rb
class Directives::MyDirective < GraphQL::Schema::Directive
description "A nice runtime customization"
end
Then, they’re hooked up to the schema using directive(...):
class MySchema < GraphQL::Schema
# Custom directives are only supported by the Interpreter runtime
use GraphQL::Execution::Interpreter
# Attach the custom directive to the schema
directive(Directives::MyDirective)
end
GraphQL::Schema::Directive::Feature and GraphQL::Schema::Directive::Transform are included in the library as examples.
Like fields, directives may have arguments :
argument :if, Boolean, required: true,
description: "Skips the selection if this condition is true"
Directive classes may implement the following class methods to interact with the runtime:
def self.include?(obj, args, ctx): If this hook returns false, the nodes flagged by this directive will be skipped at runtime.def self.resolve(obj, args, ctx): Wraps the resolution of flagged nodes. Resolution is passed as a block, so yield will continue resolution. The return value of this method will be treated as the return value of the flagged field.Looking for a runtime hook that isn’t listed here? open an issue to start the conversation!
Currently, Directive classes are never initialized. A later version of GraphQL may initialize these objects for runtime application.