Recommend Me


Vendredi 28 septembre 2007

SOAP::LC et Rails

Classé dans : Projets, Ruby — greg @ 0:54

Le développement de SOAP::LC avance doucement (il est 0h54 aussi, c’est Ruby time!) Je me suis, pour le moment, beaucoup amusé avec les WebServices Rails. Ils présentent une particularité gênante. En effet une méthode déclarée hello_world sera rendu, via la WSDL générée par Rails, sous le nom HelloWorld. Ceci implique donc d’avoir un appel sous la forme :

s = SOAP::LC.new( ).wsdl( "http://localhost:3000/sample/wsdl" ).HelloWorld( :from => "Greg" )

L’appel à HelloWorld est bien récupéré via method_missing. La preuve :

>> class Test
>>   def method_missing( id, *args )
>>     puts "Appel de #{id.id2name}(#{args.join( ", " )})"
>>   end
>> end
=> nil
>> t = Test::new
=> #<Test:0×598684>
>> t.HelloWorld( "Greg", 2 )
Appel de HelloWorld(Greg, 2)
=> nil

C’est une bonne nouvelle… Surtout pour moi qui aie toujours pensé qu’il n’était pas possible de déclarer de méthode dont le nom commence par une majuscule :

>> class Test2
>>   def HelloWorld( from )
>>     puts "Hello World par #{from}"
>>   end
>> end
=> nil
>> t2=Test2.new
=> #<Test2:0×58fdf4>
>> t2.HelloWorld( "Greg" )
Hello World par Greg

Ha ben si ! En effet la méthode HelloWorld a bien été référencé au niveau de la classe comme méthode publique d’instance :

>> Test2.public_instance_methods
=> ["inspect", "clone", "method", "public_methods", "instance_variable_defined?", "equal?", "freeze", "to_yaml_style", "methods", "respond_to?", "dup", "to_yaml", "instance_variables", "__id__", "object_id", "eql?", "to_yaml_properties", "require", "id", "singleton_methods", "send", "taint", "frozen?", "instance_variable_get", "require_gem", "__send__", "instance_of?", "taguri", "to_a", "type", "taguri=", "protected_methods", "gem", "instance_eval", "==", "display", "===", "instance_variable_set", "kind_of?", "extend", "to_s", "HelloWorld", "hash", "class", "private_methods", "tainted?", "=~", "untaint", "nil?", "is_a?"]

Mais que se passe-t-il ?
- Mais que se passe-t-il ?
- Mais qu’est-ce qui se passe ?

J’en était resté à la sacro-sainte règle de Ruby in a Nutshell disant que si un identifiant commence par une majuscule, c’est une constante. Puis j’ai relu un peu de documentation et j’ai compris que j’avais tout faux. Et c’est logique en fait : un nom de méthode c’ets bien constant. Cela dit cette permissivité du langage est dangereuse. J’ai donc ajouté une méthode call à la classe SOAP::LC::Request permettant de faire le même appel sous la forme :

s = SOAP::LC.new( ).wsdl( "http://localhost:3000/sample/wsdl" ).call( "HelloWorld", :from => "Greg" )

Au moins cela permet de conserver les conventions. et puis j’ai appris quelque chose…

Moi qui avais placé en priorité basse la relecture approfondie de Programming Ruby, je vais immédiatement la remettre en priorité 1… Enfin si Monsieur est d’accord !

• • •

Pas de commentaire »

Pas encore de commentaire.

RSS des commentairesTrackBack URI

Laisser un commentaire

You must be logged in to post a comment.

Powered by: WordPress • Template adapted from the Simple Green' Wench theme - RSS