这可能更像是一个概念问题,而不是语法问题,但我很欣赏有关如何解决问题的任何意见。在过去的几天里,我一直在困惑,并且已经到了墙上。
以下是对情况的概述,我将在下面详细介绍。
我希望用户能够输入他/她的邮政编码,然后根据该邮政编码返回天气预报。
这就是我目前所拥有的:
app / models / forecast.rb // 通过HTTParty从外部API获取天气数据,并将XML响应格式化为我想要的数据。
class Forecast < ActiveRecord::Base
attr_accessor :temperature, :icon
def initialize
weather_hash = fetch_forecast
weather_values(weather_hash)
end
def fetch_forecast
HTTParty.get("http://api.wunderground.com/api/10cfa1d790a05aa4/hourly/q/19446.xml")
end
def weather_values(weather_hash)
hourly_forecast_response = weather_hash.parsed_response['response']['hourly_forecast']['forecast'].first
self.temperature = hourly_forecast_response['temp']['english']
self.icon = hourly_forecast_response['icon_url']
end
end
app / views / static_pages / home.html.erb //在顶部提供输入邮政编码的表单,并提供显示从底部API返回的信息的位置< / p>
<div class="container">
<div class="row">
<div class="col-md-12">
<div class="search-form">
<%= form_tag("#", method: "get") do %>
<p><%= label_tag(:zipcode, "Zipcode:") %></p>
<p><%= text_field_tag(:zipcode, value = 19446) %></p>
<p><%= submit_tag("Get Weather Forecast") %></p>
<% end %>
</div>
</div>
</div>
<div class="row">
<div class="col-md-12 display">
<div class="display-info">
<h1>Forecast Info</h1>
<%= @forecast.temperature %></p>
</div>
</div>
</div>
</div>
我的问题是:
如何将用户的表单数据连接到模型?
我最好的猜测是构建一个实例化模型类的表单,调用&f; fetch_forecast&#39;使用基于用户输入的URL的方法,具体如下:
def fetch_forecast(input)
HTTParty.get("http://api.wunderground.com/api/10cfa1d790a05aa4/hourly/q/"+input+".xml")
end
但是,我不知道这是否正确,甚至可能,如果是这样,我不知道如何去做。
任何建议或指示超过欢迎,并感谢您的帮助。
答案 0 :(得分:1)
模型和视图由控制器连接(对于MVC中的C)。首先,您需要一个控制器来处理从视图中接收的参数,并将它们传递给您的模型。
很难在您的应用程序中绘制一个简单的方法来执行此操作,因为我不知道您拥有的其他模型和一般逻辑。但草图是这样的:
如果天气服务以String形式返回预测,您可以在数据库中创建表格以将此预测数据存储在某处。然后你会得到带有属性的模型预测:“zip_code”,“forecast”这是字符串。
之后你需要创建一个控制器 - ForecastsController:
def new
@forecast = Forecast.new
end
def create
@forecast = Forecast.new(forecast_params)
end
def show
@forecast = Forecast.find(params[:id])
end
private
#please note that here is no 'forecast' attribute
def forecast_params
params.require(:forecast).permit(:zip_code)
end
# other standard CRUD methods ommited
在你的模特中:
class Forecast < ActiveRecord::Base
before_save :set_forecast
protected
def set_forecast
self.forecast = # GET your forecast through API with your self.zip, which user already gave you
end
end
这就是全部。 再次:这是一个非常粗略和原始的草图,以显示最简单的逻辑。