Как исправить неправильный URI(не URI?) В ruby ​​на рельсах:URI::InvalidURIError

Я не могу передать переменные в качестве параметров для этого API: Wounderground.

Я хочу использовать входные данные в виде города и штата, используя поля ввода, и передавать их в качестве переменных в URI, чтобы пользователи могли получать прогноз погоды. Однако я не могу передать переменные в качестве параметров API, и я получаю неверный URI(не URI?) Или URI::InvalidURIError. Может кто-нибудь, пожалуйста, скажите мне, как это исправить и скажите, почему я получаю эту ошибку. если вам нужна дополнительная информация, пожалуйста, дайте мне знать. Спасибо!

модель: weathers.rb класс Weathers

attr_accessor :temperature, :city, :state, :icon, :weekday_name, 
:chance_of_rain, :chance_of_snow, :uvi, :tomorrow, :tomorrow_condition, 
:tomorrow_icon, :day_one, `enter code here`:day_one_condition, 
:day_one_high, :day_one_low, :day_two, :day_two_condition, 
:day_two_high, :day_two_low

def initialize(city, state)
@city = city
@state = state

week_weather_hash = fetch_week_forecast(city, state)
week_forecast(week_weather_hash)
end

def fetch_week_forecast(city, state)

HTTParty.get("http://api.wunderground.com/api/apikey/forecast10day/q/#
{city}/#{state}.json")
end

def week_forecast(week_weather_hash)
weekly_forecast_response = 
week_weather_hash.parsed_response['response']['forecast']
self.day_one = weekly_forecast_response['txt_forecast']['forecastdays']
['forecastday'][0]['title']
self.day_one_condition = weekly_forecast_response['txt_forecast']
['forecastdays']`enter code here`['forecastday'][0]['fcttext']

self.day_one_high = weekly_forecast_response['simpleforecast']
['forecastdays']['forecastday'][0]['high']['fahrenheit']
self.day_one_low = weekly_forecast_response['simpleforecast']
['forecastdays']['forecastday'][0]['low']['fahrenheit']

self.day_two = weekly_forecast_response['txt_forecast']['forecastdays']
['forecastday'][2]['title']
self.day_two_condition = weekly_forecast_response['txt_forecast']
['forecastdays']`enter code here`['forecastday'][2]['fcttext']

self.day_two_high = weekly_forecast_response['simpleforecast']
['forecastdays']`enter code here`['forecastday'][1]['high']
['fahrenheit']
self.day_two_low = weekly_forecast_response['simpleforecast']
['forecastdays']['forecastday'][1]['low']['fahrenheit']

Это мой контроллер: класс ForecastsController Def Show
@weather = Weathers.new (params [: city], params [: state])
конец
конец

show.html.erb Еженедельный прогноз:
<% = @ weathers.day_one%>: <% = @ weathers.day_one_condition%>
Высокий / низкий: <% = @ weathers.day_one_high%> F: <% = @ weathers.day_one_low%> F

<br>
<%=@weathers.day_two %> : <%= @weathers.day_two_condition %>
<br>
High/Low: <%=@weathers.day_two_high %>F : <%=@weathers.day_two_low 
%>F 

** мой index.html.erb и новая форма **

<%= form_tag("/forecast", method: "get", class: "form-inline") do %> 
<p class = "city-input">
<%= label_tag :City %>
<%= text_field_tag :city,  nil, class: "form-control", placeholder: 
"City Name" %>
</p>

<p class= "state-input">
<%= label_tag :State %>
<%= select_tag :state, options_for_select(us_states, "NY"), class: 
"form-control" %>
</p>

<p class= "submit">
<%= submit_tag 'Search', name: nil, class:"btn btn-primary" %>
</p>
<% end %>

Ниже приведена полная трассировка стека ошибки

Запуск GET "/ прогноз? Utf8=%E2%9C%93&city=new+york&state=NY" для 127.0.0.1 в 2017-10-26 20:09:14 -0400 (0.2ms) ВЫБРАТЬ "schema_migrations"."Version" FROM "schema_migrations" ORDER BY "schema_migrations"."Version" Обработка ASC с помощью ForecastsController# Показать в виде HTML-параметров: {"utf8"=>"✓", "city"=>"new york", "state"=>"NY"} Выполнено 500 Внутренняя ошибка сервера за 10 мс (ActiveRecord: 0,0 мс)

URI:: InvalidURIError (неверный URI(не URI?): Http://api.wunderground.com/api/apikey/forecast10day/q/new york / NY.json):

приложение / модели /weathers.rb:15: в fetch_week_forecast' app/models/weathers.rb:10:in инициализировать ' app/controllers/forecast_controller.rb:36:in new' app/controllers/forecasts_controller.rb:36:in шоу'

Продолжение ошибки неверный URI(не URI?): Http://api.wunderground.com/api/apikey/forecast10day/q/new york / NY.json

Извлеченный источник (около строки № 15): 13 14 15 16 17 18

def fetch_week_forecast(city, state)
    HTTParty.get("http://api.wunderground.com/api/apikey/forecast10day/q/#{city}/#{state}.json")
end

def week_forecast(week_weather_hash)

1 ответ

Решение

Когда вы используете HTTParty.get, вы передаете город и штат, которые являются значениями "dinamyc", так как в этом случае city - это "Нью-Йорк", URL создается с пробелом, и поэтому вы получаете сообщение об ошибке:

URI:: InvalidURIError (неверный URI (не URI?): Http://api.wunderground.com/api/apikey/forecast10day/q/new york / NY.json)

Вы могли бы использовать URI.encode(url) и таким образом, пробел будет "преобразован" в %20, лайк:

http://api.wunderground.com/api/apikey/forecast10day/q/new%20york/NY.json

Который является "действительным" URL для работы. Таким образом, вы можете немного настроить свой fetch_week_forecast метод, как:

def fetch_week_forecast(city, state)
  HTTParty.get(URI.encode("http://api.wunderground.com/api/apikey/forecast10day/q/#{city}/#{state}.json"))
end
Другие вопросы по тегам