0

原来 ActiveResource 模型之间的连接是共享的。因此,如果您在一个模型中设置格式,它确实与其他模型中的格式不同。但是,如果您.connection.format在两个单独的模型上调用该方法,则每次设置新格式时该格式都会更改。因此,如果Profile第二次以格式加载,: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

好的... Location.format 在加载 Profile 模型后仍然相同 注意:这些模型是延迟加载的,因此在您尝试调用类名之前不会包含它们的文件和代码。

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

问题就从这里开始了。在我们调用 Profile 模型之后,它完成了Location.connection.format

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

格式应该相同。当您调用 Location.find(:all, :from => "/something.xml") 之类的内容时,这会导致解析完全中断 - 它会尝试解析xmlasjson

我想我现在的问题是 - 我如何分离这两个连接?(或以其他方式解决此问题)

编辑以在控制台中添加此测试:

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

1 回答 1

1

这……感觉像个bug。

我在看ActiveResource源代码。当您format=在 ARes 类中调用该方法时,它会将格式写入connection.format.

此上下文中的connection方法将抓取@@connection是否已定义,否则将调用superclass.connection. 在我们的例子superclass中是ActiveResource::Base. 正如你可以猜到的,@@connectionLocationorProfile模型上没有定义。如果您调用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 =也应该...

暂时不会接受这个答案,因为它感觉像是一个 hack 和/或错误,但这就是我现在解决它的方法,它似乎有效。

希望其他人对此有想法?似乎没有多少人使用 ActiveResource,但我们每天都在使用它,我之前也遇到过这种情况。

于 2011-03-16T20:16:03.867 回答