2011-08-04 15 views
1

外部のRubyスクリプトからPOSTリクエストをHTTP#post_form経由でRailsアプリに送信しようとしています。 createアクション(つまり、URIはhttp://server/controller)へのリクエストが行われます。外部スクリプトから新しいレールデータベースレコードを作成しますか?

私はリクエストに単一のパラメータをエンコードした場合、すべてが正常である:

HTTP::post_form(uri, { :my_param => "value" }) 

私は明示的にコントローラに、手動でparamsからmy_paramを引き出すために持っていますけど。これは非効率的で、アプリケーション内から新しいレコードを作成することができなくなります(そのパラメータは存在しないため)。その結果、私のスクリプトをRails自身のようにして、コントローラが期待するような適切なデータを渡すようにしています。

HTTP::post_form(uri, { :object => { :my_param => "value" } }) 

ただし、これは機能しません。 post_formは明らかに同じことをしない

{ "object" => [\"my_param\", \"value\"] } 

すなわち、別のものに私のハッシュをエスケープしているようです。私はデータを渡している方法で何かを見逃していますか?または、私が(アプリの外から新しいレコードを作成した後に)何を達成することができないのですか?

答えて

1

一つの簡単な方法は、単にRailsはそのパラメータをフォーマットする方法を模倣することがあり、次のように:

params = { :my_param => "value", ... } 
params = Hash[params.map { |key,value| ["object[#{key}]",value] } ] 

HTTP::post_form(uri, params) 

編集:まあ、それを見て、私は少し周りを見て、Railsは実際にあなたを与えることがわかりましたこの方法では、独自のメカニズムを使用して同じことを行うには:

require 'active_support/core_ext' 
... 
HTTP::post(uri, parameters.to_param) 

to_param方法が正しく配列を扱いますし、あまりにも他のすべて。この場合、パラメータはすでに文字列に変換されているので、ではなく、post_formを使用することに注意してください。

+0

優秀、ありがとうございます!しかし、値が配列のときには分解されるようです。あなたはその事件をどのように扱うのか分からないのですか? – kfb

+0

私の編集した投稿をチェックしてください –

+0

素晴らしい、それはすぐにソートされています。乾杯! – kfb

1

post_formについてよく分かりませんが、自然な解決策はActiveResourceオブジェクトを使用することです。

ActiveResourceは、Railsだけでなく、Rubyでも利用できます。あなただけそれがポストモデルを使用して、これは私はあなたが、これがあることを見つけると思います

http://railscasts.com/episodes/94-activeresource-basics

http://railscasts.com/episodes/95-more-on-activeresource

ここでどのように機能するかについてRailscastがありXML を使用して取得するだけのようにあなたはそれを使用します私の言うように、私はpost_formに慣れていません。

+0

ありがとう、私はそれを見てみましょう。依存関係を維持しようとしていますが、正確に私が望むように見えることに同意します:) – kfb

+0

このアプローチの唯一の欠点は、現在ActiveRecordの関連付けをサポートしていないようです例えばhas_and_belongs_to_many)。 – kfb

+0

関連するテーブルをサポートすることはできますが、必要なレコードを含めるために独自のxmlテンプレートを作成する必要があります。私は後で私の答えを更新しようとします。 – jamesc

関連する問題