Кто использует переменные класса в вызовах SOAP с Savon? - PullRequest
0 голосов
/ 06 февраля 2011

Я пишу маленький клиент, используя Ruby и Savon.Интерфейс значительно изменился с версии 0.7 до 0.8.x.Все мои вызовы больше не работают :-(. Как я могу передать локальную переменную-член?

Ответы [ 3 ]

2 голосов
/ 08 февраля 2011

После более тщательного изучения журнала изменений я понял, что Savon использует instance_eval для выполнения блока. Поэтому нельзя использовать переменные экземпляра другого класса в этом блоке. Это также указано в журнале изменений. Чтобы решить мою проблему, я присвоил значение переменной экземпляра локальной переменной. Это помогло мне.

1 голос
/ 06 февраля 2011

Боюсь, ваш вопрос не имеет особого смысла.

  • Блоки имеют доступ ко всему доступному за пределами блока.
  • @userName и @passwd являются переменными экземпляра, а не локальными или переменными класса. В Ruby нет ничего обычно называемого «переменными-членами». В любом случае, если они установлены в классе, в котором вы делаете этот вызов, вы можете просто получить к ним доступ в пределах блока.

В качестве сноски принято использовать подчеркивание, а не регистр символов для именования переменных в Ruby - @user_name вместо @userName.

0 голосов
/ 09 марта 2011

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