Ich habe eine Datei booking.rb in meinem Modellverzeichnis. Sie enthält die Klassendefinition
class Booking < ActiveRecord::Base
def self.setup_connection
wsdlurl = 'http://10.14.47.201:7001xxx/webservice/RetrieveBookingsByCCLV1_01.wsdl'
factory = SOAP::WSDLDriverFactory.new(wsdlurl)
@@driver = factory.create_rpc_driver
@@driver.return_response_as_xml = true
end
end
Ich versuche, diese Methode von meinem application.rb siehe Code unten aufzurufen.
module PNR2
class Application < Rails::Application
...
...
Booking.setup_connection
end
end
Wenn ich die Anwendung ausführe, schlägt dies wie folgt fehl...
C:/Users/sg0209028/RubymineProjects/PNR2/config/application.rb:49:in `<class:Application>': uninitialized constant PNR2::Application::Booking (NameError)
from C:/Users/sg0209028/RubymineProjects/PNR2/config/application.rb:18:in `<module:PNR2>'
from C:/Users/sg0209028/RubymineProjects/PNR2/config/application.rb:17:in `<top (required)>
Der Grund für den Verweis auf Zeile 49 ist, dass ich alle Kommentare in dieser application.rb-Datei entfernt habe, um Platz in dieser Notiz zu sparen. Zeile 49 im Original war die Booking.setup_connection-Zeile.
Ich bin eindeutig nicht verstehen, wie Name Scoping in Rails 3 funktioniert. Vielleicht verstehe ich auch nicht, wann ich eine Klassenmethode aufrufen sollte, um eine Konstante in einem Model-Objekt einzurichten. Es fühlt sich so an, als ob das eine Aufgabe der Anwendungsinitialisierung sein sollte, aber vielleicht sollte diese Anforderung an einer anderen Stelle stehen.
Ib Fall jemand sich wundert, habe ich diesen Code und den Aufruf der entsprechenden Webdienste arbeiten in einem straingth Ruby (nicht Rails) Umgebung hatte.
Nachfolgend finden Sie den entsprechenden Code
require 'soap/wsdlDriver'
require 'rexml/document'
require 'soap/rpc/driver'
WSDL_URL = "http://10.14.47.202:7001/xxx/webservice/RetrieveBookingsByCCLV1_01.wsdl"
factory = SOAP::WSDLDriverFactory.new(WSDL_URL)
driver = factory.create_rpc_driver
driver.return_response_as_xml = true
params = {"ccl" => "Booking[BookingName[BookingNameItem[TicketNumber > \"123456789\"]]]", "xmlFormat" => "DefaultBooking"}
response = driver.RetrieveBookingsByCCL(params)
doc = REXML::Document.new response
puts "Number of PNRs = " + REXML::XPath.first(doc, "//count").text
doc.elements.each ("//originCity") {|element| puts "Element = " + element.text}
Kann jemand diesem Neuling bitte ein paar Tipps geben? Oh, und ja, mir ist klar, dass der Aufruf einiger SOAP-basierter Dienste anstelle von Backend mit einer Datenbank einige Probleme haben wird. Das bin ich bereit für, sobald ich die Verbindung zu arbeiten!
Vielen Dank im Voraus
Chris