わかりました、これは説明するのが少し難しくなりますので、ご容赦ください...
ESRI ArcGIS JavaScript API 用に作成された大規模な JavaScript コードベースを含む Rails アプリを使用して、ESRI ArcGIS Server に格納されている空間データを操作します。ESRI ArcGIS JavaScript API は、一般に「ArcGIS Server プロキシ」と呼ばれるものを使用して、トークン ベースの認証を必要とするか、URL 内で直接処理するには長すぎる ArcGIS Server サービスにリクエストを転送します。AGS プロキシは、渡された URL に HTTP リクエストを送信するだけで、元のリクエストとともに渡された追加のパラメーターを ArcGIS Server サービスに転送します。ArcGIS Server サービスは、実際の面倒な作業を行い、JSON で応答します。AGS プロキシの詳細については、ArcGIS Resource Centerの次のページを参照してください。
AGS プロキシは ASP.Net、Java、および PHP フレーバーの ESRI によってのみ提供されるため、自由に AGS プロキシを Rails コントローラーとして記述しました。私がこのアプローチを取ることにしたのは、JSAPI がクロスドメイン リクエストをサポートしておらず、ホスティング上の理由から、Rails アプリ内で PHP を提供したり、JRuby 上でアプリを実行したりしたくないからです。私の Rails AGS プロキシは、添付ファイル エディター機能で発生するマルチパート リクエストを除いて、これまでに遭遇したすべての状況で動作します。
マルチパート リクエストを機能させる試みでは、Faraday のシンプルさとマルチパート リクエストのサポートにより、Faraday を使用して ArcGIS Server サービスへの HTTP リクエストを作成することにしました。マルチパートリクエストを実行しようとする私のコードは次のとおりです。
# Configure the request
uri = URI.parse(url)
conn = Faraday.new(:url => ("http://" + uri.host.downcase)) do |faraday|
faraday.request :multipart
faraday.request :url_encoded
faraday.response :logger
faraday.adapter Faraday.default_adapter
end
# Make request
response = conn.post uri.path do |req|
req.body = agsparams
end
「agsparams」変数は、ArcGIS Server に渡されるパラメーターのハッシュです。
このコードを実行しようとすると、実際のリクエストが行われている行で Ruby エラーが発生し、次のエラーが表示されます。
NoMethodError (undefined method `local_path' for #ActionDispatch::Http::UploadedFile:0x007ffbe198fe60
コントローラーで params ハッシュをダンプすると、次のようになります。
{
"attachment"=>#ActionDispatch::Http::UploadedFile:0x007ffbe198fe60
@original_filename="test_image.jpg",
@content_type="image/jpeg",
@headers="Content-Disposition: form-data; name=\"attachment\"; filename=\"test_image.jpg\"\r\nContent-Type: image/jpeg\r\n",
@tempfile=#File:/var/folders/mh/2mfy5nr54gngrzg06gzp1jcw0000gn/T/RackMultipart20120718-2772-xwbgjy,
"f"=>"json",
"http://arcgisserver.com/arcgis/rest/services/multitenant/test_organization/FeatureServer/0/4808/addAttachment"=>nil
}
(これが StackOverflow に表示されるように、いくつかの括弧を削除しました。)
「local_path」メソッドを呼び出していないので、どこで呼び出されているのかわかりませんが、これは、理解できない ActionDispatch に関連付けられているある種の組み込み機能であると思います。オーバーライドする必要がある ActionDispatch のメソッドはありますか? 私は、ArcGIS Server がアップロードできるように、ファイル入力パラメーターを ArcGIS Server に転送したいだけなのに、指定したファイルのアップロードを ActionDispatch が試みているという予感があります。Faraday::UploadIO を使用したいとは思いません。パラメータを ArcGIS Server に転送する必要があるだけだと思うのですが、間違っている可能性があります。ここからどこへ行くの??
追加のデューデリジェンスとして、マッピング JavaScript が AGS プロキシの他のフレーバーで動作することを確認しました。また、Wireshark で動作中のマルチパート プロキシ リクエストを検査し、それらのリクエストを Rails AGS プロキシで作成されたリクエストと比較しましたが、一貫しているように見えます (ヘッダーとパラメーターは正しく見えます)。添付ファイルを追加しようとしているデータは、実際には添付ファイルを受け入れるように適切に構成されています。私は立ち往生しており、本当に助けが必要です。
私の環境について少し: 私のアプリは Ruby 1.9.2 の Rails 3.2 で書かれています (私は現在、CarrierWave と Fog を使用して、アプリの他の非マッピング部分の添付ファイルを処理しています)。ArcGIS JSAPI 2.8/Dojo 1.6 を介して、ArcGIS Server 10.1 を実行しているサーバーに投稿しようとしています。
前もって感謝します...