Ruby 在 Rails 上:获取模型的表单输入
Ruby on Rails: Getting Form Input to Model
我仍在学习更多关于 Rails 的知识,我开始尝试使用 API,但我似乎无法弄清楚如何从表单获取输入到模型。
我想接受用户输入(以邮政编码的形式)并让它输出该用户位置的天气信息。
表格 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
我不太确定如何将输入从表单获取到模型。这实际上只是为了显示天气。我没有尝试在数据库中保存任何内容
您似乎在点击提交后没有点击您的家庭控制器。确保使用
正确路由
root to: 'pages#home'
并将其添加到您的表单中
<%= form_tag(root_path, method: 'get') do %>
如果您不提供方法,表单助手默认为 "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 %>
接下来,如果您尝试在没有 params[:zip]
的情况下实例化 @weather_lookup
变量,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 键,否则我会自己测试一下。
我仍在学习更多关于 Rails 的知识,我开始尝试使用 API,但我似乎无法弄清楚如何从表单获取输入到模型。
我想接受用户输入(以邮政编码的形式)并让它输出该用户位置的天气信息。
表格 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
我不太确定如何将输入从表单获取到模型。这实际上只是为了显示天气。我没有尝试在数据库中保存任何内容
您似乎在点击提交后没有点击您的家庭控制器。确保使用
正确路由root to: 'pages#home'
并将其添加到您的表单中
<%= form_tag(root_path, method: 'get') do %>
如果您不提供方法,表单助手默认为 "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 %>
接下来,如果您尝试在没有 params[:zip]
的情况下实例化 @weather_lookup
变量,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 键,否则我会自己测试一下。