2011-03-15 46 views
0

原來的ActiveResource模型之間的連接共享。所以,如果你在一個模型中設置的格式,它確實遠離其他車型不同的格式。但是,如果您在兩個不同的型號上調用.connection.format方法,那麼每次設置新格式時都會更改該格式。所以,如果Profile得到裝載第二,然後.connection.format格式:json兩個模型變成ActiveResource::Formats::JsonFormat如何讓兩個不同的ActiveResource模型使用兩個不同的連接對象?

我原來的問題是完全不同的(我沒有完全理解發生了什麼) - 你可以看看編輯歷史看到原來的版本。希望我會得到更多的答覆......

證明:

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 

好吧...... Location.format仍然有裝載的剖面模型 注意後是相同的:這些模型是懶加載,以使得不包含他們的文件和代碼,直到你嘗試調用班級名稱。

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

而這裏的問題開始。我們已經取得的剖面模型的一個電話後,f'ed了Location.connection.format

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

的格式爲應該是相同的。這會導致解析在您調用諸如Location.find(:all,:from =>「/something.xml」)時完全被破壞 - 它試圖解析爲json

我想我的問題現在是 - 我如何分開兩個連接? (或者以其他方式解決此問題)

編輯在控制檯中添加此測試:

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

回答

1

這......感覺就像一個錯誤。

我看着ActiveResource源代碼。當調用format=方法在你的戰神級的寫入格式,以connection.format

在這方面會抓住@@connection如果它定義的connection方法,否則它將調用superclass.connection。在我們的例子superclassActiveResource::Base。正如您可以猜到,@@connectionLocationProfile模型沒有定義。它會如果你打電話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,但我們每天都使用它,而且我之前也遇到過這個問題。

相關問題