股票报价宝石 - 检索不存在的股票代码产生nomethoderror

时间:2013-07-21 06:34:39

标签: ruby stockquotes

我正在使用“股票报价”gem(https://github.com/tyrauber/stock_quote)来根据用户输入代码检索股票价格。虽然我有一个最新的股票代码列表,但在某些情况下搜索不会产生任何结果。我在我的代码中有这个以获得引用:

@companyname = StockQuote::Stock.quote(@ticker).company
@exchange = StockQuote::Stock.quote(@ticker).exchange
@price = StockQuote::Stock.quote(@ticker).last

当@ticker =“AKO-A”

时会产生这种情况
undefined method `attributes' for nil:NilClass
file: stock.rb location: block in parse line: 90

无论如何,通过使我的代码更健壮(如果错误然后“空白”)来避免这种nomethoderror?对不起,我对ruby比较新,并且非常感谢任何帮助,指出我正确的方向。

3 个答案:

答案 0 :(得分:2)

是的,问题肯定是宝石。假设符号是准确的,并且没有正确解析坏符号的响应。

马虎。重写了类以获得更清晰的代码和更高的稳定性。在response_code实例方法中添加,该方法返回200或404,具体取决于响应的有效性。还有,成功吗?还是失败?实例方法。而且,更好的规格覆盖率。

版本碰撞,推到了rubygems。

答案 1 :(得分:0)

这是Ruby代码的常见情况,也是在失败的搜索中返回nil的常用习惯用法。

然而,当它无法获得良好的搜索结果时,这个特定的宝石有点片状。您可以使用begin ... rescue块来保护自己免受失败。

begin
  stock_quote = StockQuote::Stock.quote(@ticker)
rescue StandardError
  stock_quote = nil
end

if stock_quote
  @companyname = stock_quote.company
  @exchange = stock_quote.exchange
  @price = stock_quote.last
end

这对您来说可能不是理想的程序流程,因此您可能需要对此进行调整。

注意StandardError是默认获救的,我不需要写。您也可以将NoMethodError置于您的情况中,并且通常您希望将例外情况限制到您知道如何从错误中恢复的特定代码部分,并且仅限于您确信自己的错误类型处理代码正在做正确的事情。

答案 2 :(得分:0)

下面是一个示例,说明如何使用救援措施来解决不存在的股票代号问题

require 'stock_quote'

class StockClass

def self.symbol_check(symbol)
  StockQuote::Stock.quote(symbol).symbol
end

def self.price_by_symbol(symbol)
  StockQuote::Stock.quote(symbol).latest_price
end

def self.write_price_by_symbol(symbol, price)
  filename = "#{symbol}.csv"
  todays_date = Time.now.strftime('%Y-%m-%d')
  File.open(filename, "a") do |file|
    file << "#{todays_date}, #{price}\n"
  end
end

end

def stock_price_selector(*symbol_array)
  symbol_array.each do |stock_name|
    begin
      stock_check = StockClass.symbol_check(stock_name)
    rescue  NoMethodError
      puts "#{stock_name} is a bogus ticker symbol"
    else
      stock_price = StockClass.price_by_symbol(stock_name)
      stock_written = StockClass.write_price_by_symbol(stock_name, stock_price)
    end
  end
end


stock_price_selector('AAPL', 'APPL', 'MSFT', 'GOOG')

这将跳过伪造的符号“ APPL”,并使用合法的股票代号。