0

ActiveResource モデル間の接続が共有されていることがわかります。したがって、あるモデルでフォーマットを設定すると、他のモデルのフォーマットと異なるままになります。ただし、2 つの別々のモデルでメソッドを呼び出すと.connection.format、新しい形式を設定するたびにその形式が変更されます。したがってProfile、フォーマットで2番目にロードされた:json場合.connection.format、両方のモデルが次のようになりますActiveResource::Formats::JsonFormat

私の元の質問は完全に異なっていました (何が起こっているのか完全には理解していませんでした) - 編集履歴を見て元のバージョンを確認できます。もっと反応が返ってくるといいのですが…

証拠:

class Location < ActiveResource::Base
  self.format = :xml
end

class Profile < ActiveResource::Base
  self.format = :json
end

その後、rails console...

>> Location.format
=> ActiveResource::Formats::XmlFormat
>> Location.connection.format
=> ActiveResource::Formats::XmlFormat

これまでのところ、Locationモデルとその接続は正しい形式になっています。

>> Profile.format
=> ActiveResource::Formats::JsonFormat

普通に見える、それProfileが私が望むフォーマットです。

>> Location.format
=> ActiveResource::Formats::XmlFormat

わかりました... Profile モデルをロードした後も Location.format は同じままです : これらのモデルは遅延ロードされるため、クラス名を呼び出そうとするまでファイルとコードは含まれません。

>> Location.connection.format
=> ActiveResource::Formats::JsonFormat

そして、ここから問題が始まります。Profile モデルを呼び出した後、Location.connection.format

>> Profile.connection.format
=> ActiveResource::Formats::JsonFormat

フォーマットは同じである必要はありませんxmlこれにより、 Location.find(:all, :from => "/something.xml") のようなものを呼び出すと、解析が完全に壊れます- asを解析しようとしますjson

私の質問は今だと思います-2つの接続をどのように分離しますか? (または、この問題を解決する)

編集してコンソールにこのテストを追加します。

>> Location.connection == Profile.connection
=> true
4

1 に答える 1

1

これは...バグのように感じます。

ActiveResourceソースコードを見ていました。format=ARes クラスでメソッドを呼び出すと、フォーマットが に書き込まれますconnection.format

connectionこのコンテキストのメソッドは、定義されている場合はグラブし、@@connection定義されていない場合は を呼び出しますsuperclass.connection。私たちの場合superclassActiveResource::Baseです。ご想像のとおり@@connectionLocationまたはProfileモデルは定義されていません。クラスで呼び出すと設定さself.site=ます。この場合、self.format=メソッドはオブジェクトのクラス固有のバージョンにフォーマットを設定しconnectionます。

私の場合、ActiveResource モデルごとに異なるサイト変数を使用する理由はなく、単に戻り形式が異なるだけです。このため、私はActiveResource::Base.site = "myresource.local"開発で設定していました(および production.rb env ファイルの適切なものも)。

それで、この問題に対する私の修正は?

class Location < ActiveResource::Base
  self.site = self.site
  self.format = :xml
end

はい、self.site = self.siteクラスが独自の接続オブジェクトを使用するように強制します。どういうわけか私もそうすべきだと感じてself.format =います...

ハックやバグのように感じるので、まだこの回答を受け入れるつもりはありませんが、それが今のところ解決した方法であり、うまくいくようです。

うまくいけば、他の誰かがこれについて考えていますか?多くの人が ActiveResource を使用しているようには見えませんが、日常的に使用していて、以前にこれに遭遇したことがあります。

于 2011-03-16T20:16:03.867 に答える