2012-05-23 15 views
5

私はこれをしばらく見てきましたが、現在は紛失しています。私は問題をJSONに関連するものに絞り込み、JSONは見やすい形式で送信されているようには見えません。Rails 3.2 - ActiveResource - JSONでPOST/PUTを使用

以前はRails 3.0.7(私が記述しようとしている問題は存在しませんでした)を使用していました。いくつかの新しい機能を利用するためにRailsをアップグレードする必要がありますが、今はこの問題があります。私はこの時点でそれが簡単な構成か何かであるとほとんど確信していますが、私はそれについてもっと目を向ける必要があります。

私たちはActiveResourceオブジェクトを使用しています。オブジェクトの値を設定して保存すると(PUTを作成すると)、ab 403:ForbiddenがリモートWebサービスから返されます。これはWebサービス層では問題ありません。

新しいオブジェクトを作成してPOSTを実行すると、デフォルト値でデータベースを更新しようとすると、409:Conflictが返されます。つまり、jsonデータがサービスに到達していないことを意味します。

私の問題は、これがRails 3.0.7で動作し、3.2.3(または私も試した3.1.3)では動作しないということです。私はJSONデータ以外の提案にはオープンしていますが、それが問題のどこにあるのかはかなり確信しています。

マイActiveResourceモデルは

self.format = :json 

は、私は私の初期化ファイルのいずれかに次のように持っている:任意の提案のための

ActiveResource::Base.include_root_in_json = false 
ActiveSupport::JSON.backend = "json_gem" 

感謝を!

UPDATE

私はカールと一緒にテストし、それがで動作するようになってきた:

curl -H "Content-Type: application/json" -d "{\"userID\":\"xxx\", \"label\":\"doc.test.test\", \"value\":\"1,19\", \"id\":\"-1\"}" -v -X POST http://host:port/usermanagement/users/xxx/prefs 

私は仕事が、

  1. に、コンテンツを表示されていることです-Typeヘッダーを明示的に設定する必要があります。それ以外の場合は415になります。Media Unrecognized error

  2. ActiveResourceオブジェクトにContent-Typeヘッダーを設定しても、私はまだ409:Conflictエラーが発生します。これはJSONがまだ正しく構成されていないと信じさせます。 RailsはJSONに根を保っている -

EDIT(再び)

私は、JSONの問題がどこにあるか考え出しました。 したがって、代わりにそれはしかし、私はfalseにinclude_root_in_jsonを設定している

{"ResourceName": {"name":"value", "name":"value"}} 

を送信している

{"name":"value", "name":"value"} 

として戻ってリソースを送信する - 私は、初期化ファイルで、直接モデル自体の両方でこれを試してみました、そして変化はない。

+2

で修正されていますしかし、なぜ誰かが 'include_root_in_json'設定がうまくいかないというアイデアがあるなら、設定がより洗練された解決策であるとわかっているので、私はまだ非常に興味があります。ありがとう! – Krista

+0

解決策を回答として追加し、それを受け入れることができます... – Smar

+0

ありがとう!良いアイディア – Krista

答えて

1

だから私は単にself.attributes.to_json

class Document < ActiveResource::Base 
    self.site += 'user/:user_id' 
    self.element_name = "docs" 

    def to_json(options={}) 
    self.attributes.to_json(options) 
    end 
end 
1

を返すために、私のモデルでto_jsonメソッドをオーバーライドすることで、この(その周りに働いていた)を「固定」ActiveResourceのように見える:: Base.include_root_in_jsonはRailsのに壊れています3-2-安定している(3.2.13を含む)。この問題は、スタンドアロンactiveresourceレポで修正されています:

def to_json(options={}) 
    super(include_root_in_json ? { :root => self.class.element_name }.merge(options) : options) 
end 

あなたは猿が同じことを実行して、初期化子の一つで、それにパッチを適用することができます。

更新:この問題は、だから私は単に `self.attributes.to_json`を返すために、私のモデルで` to_json`メソッドをオーバーライドすることで、これを「固定」レール3-2-安定backport commit

+0

3-2-stableがこのパッチのプルリクエストをマージしました。次のバージョン3.2.14にはこの修正が含まれます。 – Dingle

関連する問題