使用用户输入的变量访问哈希键,Nil值无方法错误NoMethodError

时间:2015-09-29 07:24:37

标签: ruby-on-rails ruby

您好我创建了一个由JSON文件组成的小型ruby项目。我将JSON数据存储到哈希键中。并且使用用户输入来访问存在于散列键中的数据的方法。但是,当我尝试发送使用用户输入时,我收到此错误

nil的

how_many_ingredients': undefined method个键:NilClass(NoMethodError)

我发现此链接有相同的问题,并尝试了该解决方案,但我仍然得到相同的错误 Accessing Hash Keys with user inputted variables, NoMethodError

编写所有方法的文件

require 'json'

class Methods

  attr_accessor :name, :text
  def initilize(name)
    @name = name
    @text = text
  end



  def how_many_ingredients(text)
    puts 'text'

     file = File.read('a.json')
    hash = JSON.parse(file)
    #puts hash['recipes']['pizza'].keys 


    puts hash['recipes'][text].keys

  end

end

文件2访问how_Many_ingredients方法,我可以看到变量传递给该方法

require './1'
class Hello < Methods


 person = Methods.new

person.test
puts "enter recipie"
person.name
str = gets
person.how_many_ingredients str
end

2 个答案:

答案 0 :(得分:2)

请注意,使用gets时,输入可以包含换行符和回车符。您需要使用gets.chomp来过滤这些内容。这可能是您程序中问题的原因。

比较以下两个:

> puts gets.size
"Hello!"
# 7

> puts gets.chomp.size
"Hello!"
# 6

请注意,您仍然需要将程序扩展到用户输入的密钥中,而这些密钥不在您的哈希值中。

答案 1 :(得分:0)

您的代码假定hash['recipes'][text]处始终存在哈希值 - 您需要满足不存在的情况。

执行此操作的一种简单方法是使用&&符号向下遍历哈希 - 如果任何步骤为nil(或false),则该行将返回nil(或false)而不是爆炸。例如

puts hash['recipes'] && hash['recipes'][text].is_a?(Hash) && hash['recipes'][text].keys

注意我在调用hash['recipes'][text]之前测试.keys是一个哈希(而不仅仅是一个字符串)。