我正在使用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
答案 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