httparty NoMethodError: неопределенный метод `[]' для nil:NilClass

Я использую Ruby 2.5.0, httparty gem Моя модель

class FeedEntry
  include Mongoid::Document
  include Mongoid::Timestamps

  field :guid, type: String
  field :url, type: String
  field :share_count, type: Integer, default: 2

  before_update :share_info

  def share_info
    checked_url = self.url
    json_stats = HTTParty.get("http://api.sharedcount.com/?url=#{checked_url}&apikey=#{Rails.application.credentials.socialshared_api_key}", timeout: 180, open_timeout: 1200)
    self.share_count = json_stats['Facebook']['share_count']
  end
end

И когда я пытаюсь разобрать, у меня есть эта ошибка

NoMethodError: undefined method `[]' for nil:NilClass

/Users/ipatov/rails_projects/apps/tm/app/models/feed_entry.rb:71:in `share_info'

71 строка self.share_count = json_stats['Facebook']['share_count']


person Anton Ipatov    schedule 07.05.2018    source источник
comment
По-видимому, json_stats['Facebook'] равно нулю. И вы не можете позвонить ['share_count'] на ноль. Таким образом ошибка.   -  person jvillian    schedule 07.05.2018
comment
@jvilian, как этого избежать?   -  person Anton Ipatov    schedule 07.05.2018
comment
Возможно, вам следует добавить содержание json_stats к вашему вопросу.   -  person jvillian    schedule 07.05.2018


Ответы (1)


Это одна из наиболее распространенных ошибок относительно того, что Роллбар говорит

Проблема должна заключаться в том, что json_stats['Facebook'] является nil, поэтому доступ к ['share_count'] приводит к ошибке. Я рекомендую вам использовать dig, чтобы предотвратить эту нежелательную ошибку и решить, что делать, когда json_stats['Facebook'] равно nil.

    self.share_count = json_stats.dig('Facebook', 'share_count')
person Fran Martinez    schedule 07.05.2018
comment
Хорошая мысль. Возможно, для ясности вы могли бы добавить использование dig в свой ответ. - person jvillian; 07.05.2018
comment
сделано, пожалуйста, найдите его отредактированным. Я также добавил ссылку на метод хеширования dig - person Fran Martinez; 07.05.2018