我在app / services中设置了一个服务,从政府那里提取文章。旅行警告和咨询的API(见下文)。我想做的是运行这个代码,它解析响应并在运行rake db:seed时保存到我的数据库。我不知道如何从种子文件中运行它 - 我可以运行Govt.request_data吗?
class Govt
def self.request_data
travel_alerts = request_data('http://travel.state.gov/_res/rss/TAs.xml')
travel_warnings = request_data('http://travel.state.gov/_res/rss/TWs.xml')
warnings_array = travel_warnings["rss"]["channel"]["item"]
alerts_array = travel_alerts["rss"]["channel"]["item"]
parse_and_save(warnings_array)
parse_and_save(alerts_array)
end
def self.parse_and_save(advisory_array)
advisory_array.each do |element|
country_name_regex = element["title"].match(/.+?(?= Travel)/)
country = Country.find_by(name: country_name_regex.to_s)
if country
country.update(
title: element["title"],
description: element["description"],
publication_date: element["pubDate"])
if element["description"].include?("This Travel Warning")
country.update(advisory_type: "warning")
else
country.update(advisory_type: "alert")
end
end
end
end
def self.request_data(link)
Hash.from_xml(Net::HTTP.get_response(URI.parse(link)).body)
end
end
谢谢!
答案 0 :(得分:2)
我重新构建了您的代码以简化操作。
class Govt
def self.request_data(link)
hash_from_api = Hash.from_xml(Net::HTTP.get_response(URI.parse(link)).body)
end
def self.get_array(hash_from_api)
travel_alerts = request_data('http://travel.state.gov/_res/rss/TAs.xml')
alerts_array = travel_alerts["rss"]["channel"]["item"]
end
def self.parse_and_save(advisory_array)
advisory_array.each do |element|
country_name_regex = element["title"].match(/.+?(?= Travel)/)
country = Country.find_by(name: country_name_regex.to_s)
if country
country.update(
title: element["title"],
description: element["description"],
publication_date: element["pubDate"])
if element["description"].include?("This Travel Warning")
country.update(advisory_type: "warning")
else
country.update(advisory_type: "alert")
end
end
end
end
end
在你的佣金任务中你可以做这样的事情
travel_alert_hash = Govt.request_data('http://travel.state.gov/_res/rss/TAs.xml')
travel_warnings_hash = Govt.request_data('http://travel.state.gov/_res/rss/TAs.xml')
alerts_array = Govt.get_array(travel_alert_hash)
warnings_array = Govt.get_array(travel_warnings_hash)
Govt.parse_and_save(alerts_array)
Govt.parse_and_save(warnings_array)
当然,您可以根据自己的需要重构上述代码,但这是它的基本要点。如果符合您的需要,请告诉我。
编辑:我已经创建了一个示例应用程序来进行测试,一切似乎都按预期工作。如果您需要访问示例应用程序,请告诉我。我非常乐意分享代码库。