от
Я создаю простое приложение, которое использует API Open Weather Map и возвращает некоторые параметры погоды и gif, соответствующий текущей погоде. Пользователи могут искать текущую погоду города. Локально все работает нормально, но я развернул в Heroku и при поиске города выдает ошибку. Логи Heroku показывают
ActionView::Template::Error (Nil location provided. Can't build URI
Мой код ниже. Ошибка возникает в этой строке:
class ForecastsController < ApplicationController

  TOKEN = Rails.application.credentials.openweather_key

  def current_weather
    @city = params[:q]
    if @city.nil?
      @forecast = {}
    else
      @forecast = OpenWeatherApi.new(@city, TOKEN).my_location_forecast
    end
    @forecasts_facade = ForecastsFacade.new(@forecast)
  end
end
хелперы / forecasts_helper.rb
module ForecastsHelper
  GIFS = {
    thunder:
      {codes: [200, 201, 202, 210, 211, 212, 221, 230, 231, 232],
       urls: %w(
          https://media.giphy.com/media/26uf5HjasTtxtNCqQ/giphy.gif
          https://media.giphy.com/media/vS09bj1KrXwje/giphy.gif
)},
    light_rain:
      {codes: [300, 301, 302, 310, 311, 312, 313, 314, 321, 500, 501, 520, 521],
       urls: %w(
          https://media.giphy.com/media/xT9GEz2CeU9uaI2KZi/giphy.gif
          https://media.giphy.com/media/k28n1OPefBEeQ/giphy.gif
          https://media.giphy.com/media/H1eu9Vw957Rfi/giphy.gif
          https://media.giphy.com/media/Jyeo8wBpdwpry/giphy.gif
          https://media.giphy.com/media/14d8cRr25KPxbG/giphy.gif
)},
    heavy_rain:
      {codes: [502, 503, 504, 522, 531, 511],
       urls: %w(
          https://media.giphy.com/media/1Yfxps0AHRYBR2tK2G/giphy.gif
          https://media.giphy.com/media/7zSIC0roM238CVTS4u/giphy.gif
          https://media.giphy.com/media/l0Expn6D0D3g9NExq/giphy.gif
)},
    }

  def find_gif_url
    GIFS.each do |key, value|
      if value[:codes].include? @forecasts_facade.weather_code
        return value[:urls].sample
      end
    end
  end
end
             

Ваш ответ

Отображаемое имя (по желанию):
Конфиденциальность: Ваш электронный адрес будет использоваться только для отправки уведомлений.
Анти-спам проверка:
Чтобы избежать проверки в будущем, пожалуйста войдите или зарегистрируйтесь.

1 Ответ

0 голосов
от
Ваш вызов этому методу:
def find_gif_url
  GIFS.each do |key, value|
    if value[:codes].include? @forecasts_facade.weather_code
      return value[:urls].sample
    end
  end
end
Возвращается
nil
. То есть, ваш поиск записи в хеше
GIFS
фактически не дал результата. Рассмотрите значение
@forecasts_facade.weather_code
и почему его нельзя найти в значении
value[:codes]
. Добавление некоторого кода для обработки случая, когда запись в
GIFS
не была найдена, является, вероятно, хорошей идеей. Кроме того, я мог бы рекомендовать использовать
Enumerable#find
вместо перебора
GIFS
и возврата вручную. Это будет «идиоматический Рубин» или «Рубиновый способ сделать это».     
Добро пожаловать на сайт ByNets, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...