我正在使用https://github.com/tyrauber/stock_quote以获取库存数据.然而,在这样做的



我是ruby on rails的新手(在进行搜索时,我在StocksController#搜索中得到StockQuote::NoDataForStockError。。。。。。。。。。。。。。。。。。。。。。。。。。。

我的型号

class Stock < ActiveRecord::Base
def self.find_by_ticker(ticker_symbol)
where(ticker: ticker_symbol).first
end

def self.new_from_lookup(ticker_symbol)
looked_up_stock = StockQuote::Stock.quote(ticker_symbol)
return nil unless looked_up_stock.name
new_stock = new(ticker: looked_up_stock, name: looked_up_stock.name)
new_stock.last_price = new_stock.price
new_stock
end
def price
    closing_price = StockQuote::Stock.quote(ticker).close
    return "#{closing_price} (closing)" if closing_price
    opening_price = StockQuote::Stock.quote(ticker).open
    return "#{opening_price (opening)}" if opening_price
    "Unavailable"
end
end

搜索时在控制台中出现错误。

StockQuote::NoDataForStockError: StockQuote::NoDataForStockError
            from C:/RailsInstaller/Ruby2.2.0/lib/ruby/gems/2.2.0/gems/stock_quote-1.2.3/lib/stock_q
    uote/stock.rb:134:in `parse'
            from C:/RailsInstaller/Ruby2.2.0/lib/ruby/gems/2.2.0/gems/stock_quote-1.2.3/lib/stock_q
    uote/stock.rb:86:in `block in quote'
            from C:/RailsInstaller/Ruby2.2.0/lib/ruby/gems/2.2.0/gems/rest-client-1.6.7/lib/restcli
    ent/request.rb:228:in `call'
            from C:/RailsInstaller/Ruby2.2.0/lib/ruby/gems/2.2.0/gems/rest-client-1.6.7/lib/restcli
    ent/request.rb:228:in `process_result'
            from C:/RailsInstaller/Ruby2.2.0/lib/ruby/gems/2.2.0/gems/rest-client-1.6.7/lib/restcli
    ent/request.rb:178:in `block in transmit'
            from C:/RailsInstaller/Ruby2.2.0/lib/ruby/2.2.0/net/http.rb:853:in `start'
            from C:/RailsInstaller/Ruby2.2.0/lib/ruby/gems/2.2.0/gems/rest-client-1.6.7/lib/restcli
    ent/request.rb:172:in `transmit'
            from C:/RailsInstaller/Ruby2.2.0/lib/ruby/gems/2.2.0/gems/rest-client-1.6.7/lib/restcli
    ent/request.rb:64:in `execute'
            from C:/RailsInstaller/Ruby2.2.0/lib/ruby/gems/2.2.0/gems/rest-client-1.6.7/lib/restcli
    ent/request.rb:33:in `execute'
            from C:/RailsInstaller/Ruby2.2.0/lib/ruby/gems/2.2.0/gems/stock_quote-1.2.3/lib/stock_q
    uote/stock.rb:84:in `quote'
            from C:/Sites/tracker/app/models/stock.rb:19:in `price'
            from C:/Sites/tracker/app/models/stock.rb:14:in `new_from_lookup'
            from (irb):9
            from C:/RailsInstaller/Ruby2.2.0/lib/ruby/gems/2.2.0/gems/railties-4.2.5.1/lib/rails/co
    mmands/console.rb:110:in `start'
            from C:/RailsInstaller/Ruby2.2.0/lib/ruby/gems/2.2.0/gems/railties-4.2.5.1/lib/rails/co
    mmands/console.rb:9:in `start'
            from C:/RailsInstaller/Ruby2.2.0/lib/ruby/gems/2.2.0/gems/railties-4.2.5.1/lib/rails/co
    mmands/commands_tasks.rb:68:in `console'
            from C:/RailsInstaller/Ruby2.2.0/lib/ruby/gems/2.2.0/gems/railties-4.2.5.1/lib/rails/co
    mmands/commands_tasks.rb:39:in `run_command!'
            from C:/RailsInstaller/Ruby2.2.0/lib/ruby/gems/2.2.0/gems/railties-4.2.5.1/lib/rails/co
    mmands.rb:17:in `<top (required)>'
            from bin/rails:4:in `require'

如果查看该gem的代码,可以看到当响应代码不是200时,会返回StockQuote::NoDataForStockError。你需要深入研究它不喜欢你提供的数据。例如,您应该能够更多地查询响应,并至少确定要发送的url。

页面中断的解决方案是每次从StockQuote模块调用方法时使用begin rescue块。在块的begin部分使用常规调用,在rescue部分将值设置为nil,在这种情况下返回值"不可用"和类似的值。Ruby中的begin rescue就像Java中的try-catch。示例:

def price
    begin
      closing_price = StockQuote::Stock.quote(ticker).close
    rescue
      closing_price = nil
    end
    return "#{closing_price} (Closing)" if closing_price
    begin
      opening_price = StockQuote::Stock.quote(ticker).open
    rescue
      opening_price = nil
    end
    return "#{opening_price} (Opening)" if opening_price
    'Unavailable'
  end

最新更新