使用している gem は 2 年以上更新されていません。これについて言及するのは、Ruby の XMLRPC で発生した可能性のある変更により、gem の一部の機能が機能しなくなる可能性があるためです(これを証明するには、さらに掘り下げる必要があります)。
私が気に入らないのは、このargs_to_trac_args
方法です。
> args_to_trac_args({:max => 1000, :created_at => DateTime.now.to_s})
=> "max=1000&created_at=2012-07-10T13:58:13-04:00"
XMLRPC::Client
この文字列は、インスタンスのcall
メソッドに渡されます。
のメソッドでは、上記XMLRPC::Client
の文字列がin にcall
渡されます。そのメソッドのソースを表示すると、渡された各パラメーターに対して有効な XML 要素を生成しようとしていることがわかります。methodCall
XMLRPC::Create
parameter = params.collect do |param|
@writer.ele("param", conv2value(param))
end
これは、次のような単一の<param>
要素を生成しています
<param>
<value>
<string>max=1000&created_at=2012-07-10T13:58:13-04:00</string>
</value>
</param>
"max=1000&created_at=2012-07-10T13:58:13-04:00"
宝石のように文字列を使用して手動で完全なドキュメントを生成すると
require "xmlrpc/client"
writer = XMLRPC::Create.new
writer.methodCall('ticket.query', "max=1000&created_at=2012-07-10T13:58:13-04:00")
生成された XML は無効です。&created_at=...
<?xml version="1.0" ?>
<methodCall>
<methodName>ticket.query</methodName>
<params>
<param>
<value>
<string>max=1000&created_at=2012-07-10T13:58:13-04:00</string>
</value>
</param>
</params>
</methodCall>
私には、意図された応答はもっと似ているようです
<?xml version="1.0" ?>
<methodCall>
<methodName>ticket.query</methodName>
<params>
<param>
<value>
<string>max=1000</string>
</value>
</param>
<param>
<value>
<string>created_at=2012-07-10T13:58:13-04:00</string>
</value>
</param>
</params>
</methodCall>
しかし、Trac が要求パラメーターとして何を期待しているのか、または Ruby の XMLRPC クライアントが 2 年以上前に動作するように gem がどのように意図していたのかについて、私は十分に知りません。
予想されるリクエスト形式(引数のクエリ文字列または複数の要素を含む1 つの XML<param>
<param>
) を確認し、Github リポジトリをフォークし、必要な変更を加えますargs_to_trac_args
(私にはそれが問題の原因であると思われます)。
パラメータが単一の文字列に結合されず、["max=1000", "created_at=2012-08-10T13:58:13-04:00"],
methodCall` のような配列として残されている場合、上記の 2 番目のドキュメントで有効な XML が生成されます
writer = XMLRPC::Create.new
writer.methodCall('ticket.query', "max=1000", "created_at=2012-07-10T13:58:13-04:00")