我正在尝试使用Ruby on Rails从外部JSON响应更新数据库字段。我希望在创建新记录时执行此操作,因为数据相对静态。在未来,我需要解决刷新数据的能力,但那是另一天。
我使用以下方法创建了rails脚手架:
rails generate scaffolding hotel hotelId:integer hotelName:string hotelCity:string
我想仅使用hotelId创建一条新记录,在我的URI请求中发送hotelId,然后更新hotelName和hotelCity字段。
我坚持使用hotelId字段发送请求并保存结果。
hotel.rb型号:
class Hotel < ActiveRecord::Base
def self.save_data_from_api
api = Expedia::Api.new
response = api.get_information({:hotelId => '@hotelID'})
hotel_data = response.body
hotel_parsed = JSON.parse(hotel_data.to_json)
h = Hotel.new
h.hotelName = hotel_parsed['HotelInformationResponse']['HotelSummary']['name']
h.hotelCity = hotel_parsed['HotelInformationResponse']['HotelSummary']['city']
h.save!
h
end
end
包含在我的hotels_controller.rb
中 def new
@hotel = Hotel.new
@hotelID = Hotel.hotelID
end
我没有更新new.html.erb视图,因为我不知道如何或在何处调用save_data_from_api方法。
顺便提一下,我使用的Expedia API gem位于:https://github.com/zaidakram/expedia
答案 0 :(得分:0)
像:
class Hotel < ActiveRecord::Base
before_save :save_data_from_api
def save_data_from_api
return if hotel_id.blank?
api = Expedia::Api.new
response = api.get_information({:hotelId => hotel_id})
hotel_data = response.body
hotel_parsed = JSON.parse(hotel_data.to_json)
self.hotel_name = hotel_parsed['HotelInformationResponse']['HotelSummary']['name']
self.hotel_city = hotel_parsed['HotelInformationResponse']['HotelSummary']['city']
end
end
然后像Hotel.create(hotel_id: '33')
一样使用。
请注意,我已将您的AR属性名称更改为Ruby-ish。
修改
根据您对应用程序的操作,可能没有必要或最好从控制器添加酒店。您可能只想从rails console
加载它们,或者,如果您有酒店ID列表,则使用Rake任务。
但是,如果要从控制器加载它们,可以:
# in controller:
def new; @hotel = Hotel.new; end
def create
# note: if you're using Rails 4, use strong params here
@hotel = Hotel.new(params[:hotel])
respond_to do |format|
if @hotel.save
format.html { redirect_to @hotel, notice: 'Hotel was successfully created.' }
else
format.html { render action: "new" }
end
end
end
在你的new.html.erb
中,例如:
<%= form_for @hotel do |f| %>
<%= f.text_field :hotel_id %>
<%= f.submit 'Submit' %>
<% end %>