2011-02-23 4 views
2

내 모델 디렉토리에 booking.rb 파일이 있습니다. 그것은범위를 지정하려면 클래스 로딩이 필요합니다.

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 

나는 아래의 코드를 볼 수 내 application.rb에서이 메소드를 호출하려고 클래스 정의를 포함합니다.

module PNR2 
    class Application < Rails::Application 
    ... 
    ... 
    Booking.setup_connection 
    end 
end 

이 내가 응용 프로그램을 실행할 때 다음과 같은 실패 ...

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)> 

49 라인에 참조하는 이유는 내가 피하기 위해이 application.rb 파일에있는 모든 주석을 제거한다는 것입니다 이 메모의 공간을 차지합니다. 원래의 49 행은 Booking.setup_connection 행이었습니다.

이름 범위가 레일즈 3에서 어떻게 작동하는지 명확히 이해하지 못하고 있습니다. 아마도 Model 객체에서 상수를 설정하기 위해 클래스 메소드를 호출해야 할 때도 이해가되지 않을 수 있습니다. 그것은 응용 프로그램 초기화 작업이어야한다고 생각하지만 어쩌면 그 요청은 다른 곳에서해야합니다.

Ib 케이스 누구나 궁금해하는 점은이 코드와 Ruby (비 레일) 환경에서 작동하는 적절한 웹 서비스를 호출했기 때문입니다. 다음은

는 사람이 초보자에게 약간 포인터를 적어주세요 수

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} 

코드입니다? 오, 예, 저는 데이터베이스로 끝나지 않고 SOAP 기반의 서비스를 호출하는 것이 어떤 문제를 일으킬 것이라는 것을 알고 있습니다. 내가 일하기위한 연결을 얻게되면 나는 그것을 준비한다! 사전

크리스

답변

0

난 그냥 당신이 당신의 application.rb 파일에 예약 클래스를하고있었습니다 실현에

감사합니다. 난 당신이 응용 프로그램이 완전히 구성되지 않은이 시점에서 문제가있을 것 같아요,하지만 그 주위에 얻을 수 있다면, 실제로 모델을 사용하려면, 당신은 application.rb 파일의 상단에있는 파일을 요구해야합니다 :

require 'rails/all' 
require File.join(File.dirname(__FILE__), '../app/models/booking') 
+0

다시 말해 주셔서 감사합니다. 이제는 작동하지만 약간의 수정이 필요합니다. '../app/models/booking'경로에 앱이 제대로 포함되어 있어야합니다. 많이 감사했습니다 – seabird20

+0

다행이었습니다. 패스의/app 부분을 추가하기 위해 내 대답이 업데이트되었습니다. –

0

Booking는 루트 네임 스페이스에, 당신은 PNR2::Application 네임 스페이스 내에서 (당신의 라인 49) 함수를 호출하고 있습니다. 다음과 같이 변경해야합니다.

module PNR2 
    class Application < Rails::Application 
    ... 
    ... 
    ::Booking.setup_connection 
    end 
end 
관련 문제