0

私は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  

4

3 に答える 3

2

変更ログをより注意深く読んだ後、Savon が instance_eval を使用してブロックを実行していることを理解しました。したがって、そのブロック内で別のクラスのインスタンス変数を使用することはできません。これは、変更ログにも記載されています。私の問題を解決するために、インスタンス変数の値をローカル変数に割り当てました。それは私のためにトリックをしました。

于 2011-02-08T17:48:12.930 に答える
1

あなたの質問はあまり意味がありません。

  • ブロックは、ブロック外で利用可能なものすべてにアクセスできます。
  • @userName@passwdはインスタンス変数であり、ローカル変数やクラス変数ではありません。Ruby には、通常「メンバー変数」と呼ばれるものはありません。いずれにせよ、この呼び出しを行っているクラスに設定されていれば、ブロック内で問題なくアクセスできます。

脚注として、規則では、Ruby で変数に名前を付ける場合、キャメル ケースではなくアンダースコアを使用し@user_nameます@userName

于 2011-02-06T08:01:16.247 に答える
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
于 2011-03-09T02:00:24.943 に答える