Rails - 在创建时从外部JSON保存到数据库

时间:2014-07-03 18:18:55

标签: ruby-on-rails ruby json

我正在尝试使用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

1 个答案:

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