每个nil的未定义方法:NilClass

时间:2017-07-12 06:29:51

标签: ruby-on-rails ruby

如果我通过网络表单添加新ID,我会获得新城市的天气。但如果ID错了,我会得到:

  

“未定义的方法`每个'为nil:NilClass”......

请告诉我,如何检查服务器的响应并显示消息“您输入的ID是否错误”?

例如,对错误ID的回复:

{"cod":"404","message":"City not found: 605856"}

my_form:

<%= form_tag("search", method: "get") do %>
  <%= label_tag(:q, "Search for:") %>
  <%= text_field_tag(:q) %>
  <%= submit_tag("Go") %>
<% end %>

控制器:

@array = [703448,6058560,1819729] # ID cities

if params[:q].nil?
  @cities = @array.join(",")
else
  @array = @array << params[:q]
  @cities = @array.join(",")
end

@lookup = Weather.call(@cities)

模型:

class Weather
  include HTTParty
  base_uri "http://api.openweathermap.org/data/2.5/group?appid=***********************
  format :json

  #call the api with HTTParty and parse the JSON response 
  def self.call list_ids
    response = HTTParty.get(base_uri + '&id=' + list_ids)
    body = JSON.parse(response.body)
    list = body["list"]
  end

3 个答案:

答案 0 :(得分:1)

您可以将标准方法#fetch用于此目的:

https://ruby-doc.org/core-2.4.1/Array.html#method-i-fetch

a = [ 11, 22, 33, 44 ]
a.fetch(1)               #=> 22
a.fetch(-1)              #=> 44
a.fetch(4, 'cat')        #=> "cat"
a.fetch(100) { |i| puts "#{i} is out of bounds" }
                         #=> "100 is out of bounds"

还有一种方法#try甚至更好&.来防止出现无错误。以下是一些例子:

http://mitrev.net/ruby/2015/11/13/the-operator-in-ruby/

希望这会对你有帮助!

答案 1 :(得分:0)

调试信息&#34; def self.cal&#34;会非常有用:

Rails.logger.debug response.body

然后你就可以理解如何正确解析它。

答案 2 :(得分:0)

a=nil
puts a[:ram]
result: undefined method `[]' for nil:NilClass (NoMethodError)

为避免此类错误,您可以在nil_class.rb文件上创建并将其保存在Rails应用程序的initializers文件夹中。

class NilClass
    def method_missing(method, *args)
        ""
    end
end
a=nil

puts a[:ram]
result : ''

我们可以覆盖以避免错误。