class GraphQL::Schema::Validator::RequiredValidator
Use this validator to require one of the named arguments to be present. Or, use Arrays of symbols to name a valid set of arguments.
(This is for specifying mutually exclusive sets of arguments.)
@example Require exactly one of these arguments
field :update_amount, IngredientAmount, null: false do argument :ingredient_id, ID, required: true argument :cups, Integer, required: false argument :tablespoons, Integer, required: false argument :teaspoons, Integer, required: false validates required: { one_of: [:cups, :tablespoons, :teaspoons] } end
@example Require one of these sets of arguments
field :find_object, Node, null: true do argument :node_id, ID, required: false argument :object_type, String, required: false argument :object_id, Integer, required: false # either a global `node_id` or an `object_type`/`object_id` pair is required: validates required: { one_of: [:node_id, [:object_type, :object_id]] } end
@example require some value for an argument, even if it’s null
field :update_settings, AccountSettings do # `required: :nullable` means this argument must be given, but may be `null` argument :age, Integer, required: :nullable end
Public Class Methods
new(one_of: nil, argument: nil, message: "%{validated} has the wrong arguments", **default_options)
click to toggle source
@param one_of [Symbol, Array<Symbol>] An argument, or a list of arguments, that represents a valid set of inputs for this field @param message [String]
Calls superclass method
GraphQL::Schema::Validator::new
# File lib/graphql/schema/validator/required_validator.rb, line 40 def initialize(one_of: nil, argument: nil, message: "%{validated} has the wrong arguments", **default_options) @one_of = if one_of one_of elsif argument [argument] else raise ArgumentError, "`one_of:` or `argument:` must be given in `validates required: {...}`" end @message = message super(**default_options) end
Public Instance Methods
validate(_object, _context, value)
click to toggle source
# File lib/graphql/schema/validator/required_validator.rb, line 52 def validate(_object, _context, value) matched_conditions = 0 if !value.nil? @one_of.each do |one_of_condition| case one_of_condition when Symbol if value.key?(one_of_condition) matched_conditions += 1 end when Array if one_of_condition.all? { |k| value.key?(k) } matched_conditions += 1 break end else raise ArgumentError, "Unknown one_of condition: #{one_of_condition.inspect}" end end end if matched_conditions == 1 nil # OK else @message end end