2011-02-06 1 views
0

저는 Ruby와 Savon을 사용하여 소규모 클라이언트를 작성하고 있습니다. 인터페이스가 버전 0.7에서 0.8.x로 크게 변경되었습니다. 내 모든 전화는 :-(더 이상 작동하지 않습니다. 을 나는 로컬 멤버 변수를 전달할 수있는 방법. 의 예는, @username 및 @userPassword는 블록 내에서 정의되지 않은 참조하시기 바랍니다.누가 Savon과 SOAP 호출에서 클래스 변수를 사용합니까?

 

begin 
    @response = @authentication_svc.request :wsdl, "AuthenticateUser" do 
     http.headers["SOAPAction"] = "AuthenticateUser" 
     soap.body = "#{@userName}#{@passwd}" 
    end 
rescue Savon::SOAP::Fault => e 
    @last_soap_error = e.message 
end 
 

답변

0

모든 것을 지역 변수에 할당하지 않으려면 블록 내부에서 비누와 http와 같은 객체를 취하는 메소드를 작성하십시오. 메소드는 클래스가 아닌 인스턴스에 속하기 때문에 블록 내에서 호출 할 수는 있지만 일단 메소드 컨텍스트에 있으면 인스턴스 변수를 사용할 수 있습니다.

def do_request 
    begin 
    @response = @authentication_svc.request :wsdl, "AuthenticateUser" do 
     prepare_soap(soap,http) 
    end 
    rescue Savon::SOAP::Fault => e 
    @last_soap_error = e.message 
    end 
end 

def prepare_soap(soap, http) 
    http.headers["SOAPAction"] = "AuthenticateUser" 
    soap.body = "#{@userName}#{@passwd}" 
end 
1

나 ' m 두려워 귀하의 질문에 많은 이해가되지 않습니다.

  • 블록은 블록 외부 사용할 수 아무것도에 액세스 할 수 있습니다.
  • @userName@passwd는 인스턴스 변수가 아닌 지역 또는 클래스 변수입니다. 루비가 보통이라고 아무것도하지 않습니다 "멤버 변수 "이 호출을 수행하는 클래스에 클래스가 설정된 경우 블록 내에서 해당 클래스에 액세스 할 수 있습니다. @user_name 대신 @userName의 - 각주로

는,이 협약은 밑줄을 사용하여 루비에서 변수를 이름 지정하는 경우 낙타하지 않는 것입니다.

+0

감사합니다. 내 구식 어휘와 철자를 용서해주십시오. 제 질문을 다시 말해 보겠습니다. 저는 Savon :: Client # request에 전달한 블록 안의 인스턴스 변수에 액세스 할 수 없습니다. –

2

변경 로그를 더 자세히 읽은 후에 Savon은 instance_eval을 사용하여 블록을 실행한다는 것을 알았습니다. 따라서 해당 블록 내에서 다른 클래스의 인스턴스 변수를 사용할 수 없습니다. 그것은 또한 changelog에 명시되어 있습니다. 내 문제를 해결하기 위해 인스턴스 변수의 값을 로컬 변수에 할당했습니다. 그것은 저를위한 간계를했다.

+0

니스. 그것은 꽤 비정상적인 행동입니다. – wuputah

+0

savon은 인수없이 블록을 전달하는 경우 instance_eval 만 사용합니다. [새로운 문서] (http://rubiii.github.com/savon/)를보십시오. – rubiii