如何使用表单数据更新模型的类方法

时间:2014-11-05 05:47:03

标签: ruby-on-rails ruby ajax

这可能更像是一个概念问题,而不是语法问题,但我很欣赏有关如何解决问题的任何意见。在过去的几天里,我一直在困惑,并且已经到了墙上。

以下是对情况的概述,我将在下面详细介绍。

我希望用户能够输入他/她的邮政编码,然后根据该邮政编码返回天气预报。

这就是我目前所拥有的:

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

但是,我不知道这是否正确,甚至可能,如果是这样,我不知道如何去做。

任何建议或指示超过欢迎,并感谢您的帮助。

1 个答案:

答案 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

这就是全部。 再次:这是一个非常粗略和原始的草图,以显示最简单的逻辑。