谁在使用Savon的SOAP调用中使用类变量?

时间:2011-02-06 07:15:31

标签: ruby savon

我正在使用Ruby和Savon编写一个小客户端。界面从版本0.7变为0.8.x.我的所有电话都不再有效了:-(。 如何传递本地成员变量。 请参阅示例,@ userName和@userPassword未在块中定义。


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  

3 个答案:

答案 0 :(得分:2)

在仔细阅读更改日志之后,我了解到Savon使用instance_eval来执行块。因此,不能在该块中使用另一个类的实例变量。这也在更改日志中说明。 为了解决我的问题,我将实例变量的值赋给了局部变量。这对我有用。

答案 1 :(得分:1)

我担心你的问题没有多大意义。

  • 块可以访问块外的任何可用内容。
  • @userName@passwd是实例变量,不是本地变量或类变量。 Ruby没有任何通常称为“成员变量”的东西。在任何情况下,如果将它们设置在您正在进行此调用的类中,则可以在该块中正确访问它们。

作为脚注,惯例是在Ruby中使用下划线而不是驼峰来命名变量 - @user_name而不是@userName

答案 2 :(得分: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