2011-02-06 119 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

爲避免必須將所有內容分配給局部變量,請編寫從塊內部獲取對象(如soap和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

我恐怕你的問題並沒有多大意義。

  • 塊訪問塊外任何可用。
  • @userName@passwd是實例變量,而不是當地或類變量。Ruby沒有任何東西通常被稱爲「成員變量es。「無論如何,如果他們在您打電話的班級中設置,您可以在該塊內正確訪問他們。

作爲一個註腳,慣例是使用下劃線和Ruby的變量命名不駱駝的情況下 - 的@user_name代替@userName

+0

謝謝你的建議。請原諒我老式的詞彙和拼寫。讓我改述一下我的問題:我無法訪問我傳遞給Savon :: Client#請求的塊內的實例變量。 – 2011-02-07 07:06:34

2

在仔細閱讀changelog之後,我瞭解到Savon使用instance_eval來執行該塊。因此,不能在該塊內使用另一個類的實例變量。這也在變更日誌中說明。 爲了解決我的問題,我將實例變量的值賦給了一個局部變量。這對我來說是訣竅。

+0

不錯。這是非常不尋常的行爲。 – wuputah 2011-02-12 20:27:43