正确干燥GraphQL突变中的多个lambda的正确方法

时间:2019-05-08 14:13:57

标签: ruby graphql graphql-ruby

我正在尝试收集一堆做相同事情的lambda,并通过将其分解为一种方法来使其干燥。有问题的代码在模块/类中,我忘记了正确的方法:/

文档使用lambda显示了这样的示例-

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

我已经尝试过-

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 个答案:

答案 0 :(得分:1)

您可以尝试将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,在大多数情况下,该行为非常像lambda。

但是

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