2011-03-15 14 views
0

ActiveResourceモデル間の接続が共有されていることが分かります。したがって、1つのモデルでフォーマットを設定した場合、と他のモデルのフォーマットとは異なります。ただし、別の2つのモデルで.connection.formatメソッドを呼び出すと、新しい形式を設定するたびにその形式が変更されます。 Profileはその後、フォーマット:jsonを有する第二にロードされてしまったのであれば、両方のモデルの.connection.formatActiveResource::Formats::JsonFormat2つの異なるActiveResourceモデルで2つの異なる接続オブジェクトを使用するにはどうすればよいですか?

に変身私の元の質問は(私は完全に何が起こっていたかを理解していなかった)完全に異なっていた - あなたが編集履歴を見ることができます元のバージョンを参照してください。うまくいけば、私は...もっと回答を得るでしょう

証明:rails consoleで次に

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

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

...

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

これまでのところは良い... Locationモデルと、それは接続です正しい形式です。

通常のように見えますが、これはProfileのフォーマットです。

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

[OK]を... Location.formatはProfileモデル ロードされた後も同じである:あなたが呼び出そうとするまで、そのファイルとコードが含まれておりませんので、これらのモデルは、レイジーロードされているがクラス名。

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

ここで問題が始まります。我々はProfileモデルへの呼び出しを行った後、それはフォーマットが同じことになっていませんLocation.connection.format

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

をf'ed。 (:すべて、:=>「/something.xml」から)これは、あなたがLocation.findのようなものへの呼び出しを行う際に、完全に壊れたように解析する原因となる - 私は私の質問を推測

jsonとしては xmlの解析を試み今は - どのように私は2つの接続を分離するのですか? (または、そうでない場合は、この問題を解決する)

編集コンソールでこのテストを追加する:

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

答えて

1

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

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

connectionメソッドは、定義されている場合は@@connectionを取得し、それ以外の場合はsuperclass.connectionを呼び出します。私たちの場合、superclassActiveResource::Baseです。あなたが推測できる通り、LocationまたはProfileモデルの@@connectionは定義されていません。あなたのクラスで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を使用しているようには思えませんが、私たちは毎日それを使用しています。

関連する問題