0

JSON ペイロードからデータをサニタイズするのに役立つサービス クラスがあります。

  attr_reader :data, :method, :args

  def self.call(*args)
    new(*args).call
  end

  def initialize(data, sanitization_method, *method_args)
    @data = data
    @method = sanitization_method
    @args = *method_args
  end

  def call
    data.send(method, args)
  end

問題は、クラス メソッドを呼び出すと、列挙子が返されることです。

PaidGigs::Services::SanitizeData.call("shd234", :gsub, /[^0-9]/, "")

=>  #<Enumerator: "shd234":gsub([/[^0-9]/, ""])>

メソッドを評価して返す代わりに:

=> "234"

私はコンソールで遊んでみましたが、それは、Ruby ドキュメントが示唆していることに反して、splat 配列が個々の引数に変換されていないためです。Object#send でこの問題が発生した人はいますか? どんな助けでも大歓迎です!

4

2 に答える 2

1

args を配列として格納しているため、そのメソッドを呼び出すときは、もう一度スプラットする必要があります。

def call
  data.send(method, *args)
end

この:

@args = *method_args

スプラットは何もしないので、次のようにすることができます:

@args = method_args
于 2014-11-03T18:10:21.607 に答える
1

引数を配列として保存し、最後の瞬間に splat を使用する必要があります。

class SanitizeData
  attr_reader :data, :method, :args

  def self.call(*args)
    new(*args).call
  end

  def initialize(data, sanitization_method, *method_args)
    @data = data
    @method = sanitization_method
    @args = method_args
  end

  def call
    data.send(method, *args)
  end
end

puts SanitizeData.call("shd234", :gsub, /[^0-9]/, "").inspect
于 2014-11-03T18:02:04.517 に答える