1

REST クライアントのラッパー クラスを介してリモート リソースと通信するための単純な定義から、モジュールにメソッドを追加するためのコードがいくつかあります。

def service_function(function_name, method, uri, parameters)
  class_eval <<-RUBY
    def #{function_name}(params)
      if !(#{function_name}_required_params - params.keys).empty? || \
           !(params.keys - #{function_name}_params).empty?
        raise Errors::InvalidParameters.new(service_name, __method__,
                                            params.keys, #{function_name}_params)
      end
      WebServices::ServiceRequest.perform(self.domain, #{uri}, #{method}, params)
    end

    def #{function_name}_params
      #{function_name}_required_params + #{function_name}_optional_params
    end

    def #{function_name}_required_params
      #{parameters}.select { |param,req| req }.keys
    end

    def #{function_name}_optional_params
      #{parameters}.select { |param,req| !req }.keys
    end
  RUBY
end

コードを実行する前に、IRB にビルドしている gem を要求するだけで、次のエラーが発生します。

1.9.2p320 :001 > require 'web-services'
SyntaxError: (eval):7: unknown regexp options - rt

問題のある行は次のとおりです。

WebServices::ServiceRequest.perform(self.domain, #{uri}, #{method}, params)

「#{uri}」引数を削除すると、「#{method}」引数を残しても修正されます。これがなぜなのかについての手がかりを持っている人はいますか?私はもう途方に暮れています。

4

1 に答える 1

1

次のようurlな が/something/rtあり、ここでは正規表現リテラルのようになります。

WebServices::ServiceRequest.perform(self.domain, #{uri}, #{method}, params)

#{uri}ヒアドキュメント内の文字列のように見えるように、エスケープして引用する必要があります。そうすれば、class_evalperform(..., '/something/rt', ...)て幸せになります。で同様の問題が発生する可能性があります#{method}

于 2012-07-23T06:01:01.257 に答える