范围界定需要类加载等

时间:2011-02-23 21:58:40

标签: ruby-on-rails ruby

我的模型目录中有一个文件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行。

我显然不理解名称作用域如何在Rails 3中起作用。也许我也不明白何时应该调用类方法在Model对象中设置常量。感觉应该是应用程序初始化任务,但也许该请求应该在其他地方。

Ib的情况下,任何人都在想,我已经有了这个代码并调用了适当的Web服务,这些服务工作在一个充满活力的Ruby(非rails)环境中。

以下是

的代码
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的服务而不是以数据库结尾会有一些问题。一旦我开始工作,我就准备好了!

提前致谢

克里斯

2 个答案:

答案 0 :(得分:0)

我刚刚意识到您正在尝试在application.rb文件中使用Booking类。我认为你会遇到问题,因为此时你的应用程序还没有完全配置,但如果你可以解决这些问题,实际使用模型,你必须要求你的application.rb文件顶部的文件:

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

答案 1 :(得分:0)

Booking位于根命名空间中,您在PNR2::Application命名空间内调用该函数(在第49行)。你应该把它改成:

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