2011-03-15 6 views
0

ActiveResource 모델 간의 연결이 공유됩니다. 따라서 한 모델에서 형식을 설정하면 과 다른 모델의 형식을 유지합니다. 그러나 두 개의 개별 모델에서 .connection.format 메서드를 호출하면 새 형식을 설정할 때마다 해당 형식이 변경됩니다. 그렇다면 Profile이 두 모델에 대해 다음 .connection.format 형식 :json와 두 번째로드있어 내 원래의 질문 (나는 완전히 무슨 일이 있었는지 이해하지 못했다) 완전히 달랐다 ActiveResource::Formats::JsonFormat두 개의 서로 다른 ActiveResource 모델이 두 개의 다른 연결 객체를 사용하도록 만드는 방법은 무엇입니까?

로 바뀝니다 - 당신은 편집 역사를 볼 수 있습니다 원본 버전을 참조하십시오. 다행스럽게도 필자는 ... 더 반응을 얻을 것이다

증명하십시오 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.format 
=> ActiveResource::Formats::JsonFormat 

보통 모양은 Profile의 형식입니다.

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

좋아요 ... Location.format 여전히 프로필 모델을 를로드 한 후 동일합니다 : 당신이 전화를 시도 할 때까지이 모델은-게으른로드 자신의 파일과 코드가 포함되지 않도록 있습니다 클래스 이름.

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

여기에서 문제가 시작됩니다. 우리는 프로필 모델에 전화를했습니다 후에는 형식이 동일하다고 가정 하지있는 Location.connection.format

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

을 f'ed. (모든, => "이 /something.xml이"에서) 당신이 Location.find 같은에 전화를 걸 때 완전히 파괴 할 구문 분석됩니다 - 그것은 구문 분석을 시도하는 내 질문을 추측 xml

json로 지금은 - 두 연결을 어떻게 분리합니까? 콘솔에서이 테스트를 추가

편집 (또는 그렇지 않으면이 문제를 해결) :이 ... 버그 같은 느낌

>> 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를 사용하는 것처럼 보이지 않지만 우리는 매일 그것을 사용합니다.

관련 문제