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