Чтобы избежать необходимости присваивать все локальным переменным, напишите методы, которые принимают объекты (например, 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