Правильный способ высушить несколько лямбд в мутации GraphQL - PullRequest
0 голосов
/ 08 мая 2019

Я пытаюсь взять кучу лямбд, которые делают то же самое, и высушить их, разбив их на метод.Рассматриваемый код находится в модуле / классе, и я забыл правильный способ сделать это: /

Документы показывают пример, подобный этому, используя лямбду -

module Mutations
  class MyMutation < BaseMutation
    argument :name, String, required: true, prepare: -> (value, ctx) { value.strip! }
  end
end

Iя пытался -

module Mutations
  class MyMutation < BaseMutation
    argument :name, String, required: true, prepare: :no_whitespace

    def no_whitespace(value)
      value.strip!
    end
  end
end

Но получить метод, не найденный при ошибке класса.

Я также пытался переместить его в свой собственный модуль или класс -

module Mutations
  class MyMutation < BaseMutation
    argument :name, String, required: true, prepare: Testing::no_whitespace
  end

  class Testing
    def no_whitespace(value)
      value.strip!
    end
  end 
end

Я знаю, что это что-то глупое, но я не могу найти правильные комбинации, чтобы заставить это работать, и мой мозг забыл слишком много Ruby, чтобы вспомнить, что гуглить.

1 Ответ

1 голос
/ 08 мая 2019

Вы можете попробовать определить no_whitespace как метод модуля, например,

class Testing
  # since the example shows 2 arguments you need to be able 
  # to accept both even if you only use 1
  def self.no_whitespace(value,*_)
    value.strip!
  end
end 

, затем использовать

class MyMutation < BaseMutation
  argument :name, String, required: true, prepare: Testing.method(:no_whitespace)
end

Testing.method(:no_whitespace) вернет Method, который в большинстве случаев будет действоватьочень похоже на лямбду.

Однако, если

module Mutations
  class MyMutation < BaseMutation
    argument :name, String, required: true, prepare: :no_whitespace

    def no_whitespace(value)
      value.strip!
    end
  end
end

Возвращает NoMethodError: undefined method no_whitespace' for MyMutation:Class, попробуйте определить это как метод экземпляра класса и посмотрите, что произойдет:

def self.no_whitespace(value)
  value.strip!
end 
...