2015-04-09 5 views
0

Я все еще больше узнаю о Rails, и я начинаю играть с API-интерфейсами, но я не могу понять, как получить входные данные из формы Модель.Ruby on Rails: ввод формы в модель

Я хочу взять пользовательский ввод (в виде почтового индекса) и заставить его выплевывать информацию о погоде в этом местоположении пользователя.

Форма на home.html.erb

<%= form_tag(root_path) do %> 
    <%= label_tag :zip, "ENTER YOUR ZIPCODE TO FIND YOUR WEATHER" %><br> 
    <%= text_field_tag :zip,'', placeholder: "e.g. 91765 " %> 
    <%= submit_tag "show me the weather!" %> 
<% end %> 

контроллер pages_controller.rb

class PagesController < ApplicationController 

    def home 
    @weather_lookup = WeatherLookup.new(params[:zip]) 
    end 
end 

Модель weather_lookup.rb

class WeatherLookup 
    attr_accessor :temperature, :weather_condition, :city, :state, :zip 

    def initialize(zip) 
    self.zip = zip 
    zip = 91765 if zip.blank? 
    weather_hash = fetch_weather(zip) 
    weather_values(weather_hash) 
    end 

    def fetch_weather(zip) 
    p zip 
    HTTParty.get("http://api.wunderground.com/api/API-KEY-HERE/geolookup/conditions/q/#{zip}.json") 
    end 

    def weather_values(weather_hash) 
    self.temperature = weather_hash.parsed_response['current_observation']['temp_f'] 
    self.weather_condition = weather_hash.parsed_response['current_observation']['weather'] 
    self.city = weather_hash.parsed_response['location']['city'] 
    self.state = weather_hash.parsed_response['location']['state'] 
    end 
end 

Я точно не знаю, как получить информацию от формы к модели. Это буквально просто для того, чтобы показать погоду. Я ничего не пытаюсь сохранить в базе данных.

ответ

0

Форма хелперов по умолчанию для «POST», если вы не предоставите метод. С точки зрения вашего контроллера «GET» - это то, что вы хотите. Here's some documentation, чтобы обеспечить дополнительный контекст. Обновленная форма:

<%= form_tag(root_path, method: "get") do %> 
    <%= label_tag :zip, "ENTER YOUR ZIPCODE TO FIND YOUR WEATHER" %><br> 
    <%= text_field_tag :zip,'', placeholder: "e.g. 91765 " %> 
    <%= submit_tag "show me the weather!" %> 
<% end %> 

Далее, если вы пытаетесь создать экземпляр @weather_lookup переменных без params[:zip], Rails выдаст ошибку. Добавление условного к вашему контроллеру позволит решить эту проблему:

class PagesController < ApplicationController 

    def home 
    if params[:zip] 
     @weather_lookup = WeatherLookup.new(params[:zip]) 
    end 
    end 

end 

Убедитесь, что ваш маршрут настроен. Что-то, определяющее root, должно существовать в routes.rb. Например:

root "pages#home" 

Я считаю, что вам также нужно разобрать JSON в хэш внутри вашей модели. Добавлю, что к методу weather_values:

def weather_values(weather_json) 
    weather_hash = JSON.parse weather_json 
    self.temperature = weather_hash.parsed_response['current_observation']['temp_f'] 
    self.weather_condition = weather_hash.parsed_response['current_observation']['weather'] 
    self.city = weather_hash.parsed_response['location']['city'] 
    self.state = weather_hash.parsed_response['location']['state'] 
    end 

Наконец, убедитесь, что вы ссылка @weather_lookup где-то в вашей точке зрения, иначе данные не будут отображаться. Простой, неформатированный пример:

<%= @weather_lookup %> 

Предполагая, что логика работает в вашей модели, JSON должны оказывать после отправки почтового индекса через форму. У меня нет API-ключа, иначе я бы сам это испытал.

+0

спасибо миллион! это делает именно то, что я хочу сделать сейчас! – huihuihui

0

Похоже, вы не нажимаете на свой домашний контроллер после того, как нажали submit. Убедитесь, что вы правильно маршрутизации с

root to: 'pages#home' 

и добавить в форму

<%= form_tag(root_path, method: 'get') do %> 
Смежные вопросы