如何将 HTTParty 响应保存到数据库?(更新!)
How to save HTTParty response to db?(Update!)
需要将 httparty 响应保存到数据库并在视图文件中调用它
这就是 httrparty 得到的
在服务文件夹中/
class ParserService
include HTTParty
API_KEY = '882e10dd2b474a23bb7a3efa85e66b61'.freeze
base_uri 'https://newsapi.org/v2/'
default_params fielsd: "title, description, ulr, content"
format :json
def self.top_headlines(country_name='us')
new(country_name).top_headlines
end
def initialize(country_name='us')
@options = { query: { country: country_name, apiKey: API_KEY} }
end
def top_headlines
response = self.class.get("/top-headlines", @options)
pars_json = response.parsed_response
pars_json["articles"].each do |k|
@source = ActiveModel::Source.create(google_id: k["id"], name: k["name"])
@article = Article.create(title: k["title"], source_id: @source.id,
description: k["description"], content: k["content"])
end
end
end
文章控制器
class ArticlesController < ApplicationController
def index
@articles = Article.all
end
end
和型号
class Article < ApplicationRecord
belongs_to :source, class_name: "Source", optional: true
validates :title, presence: true
validates :source_id, uniqueness: true
end
和schema.rb
这就是我现在所做的
如果尝试在 (rails c) 控制台中保存文章有此错误,验证
当尝试评论验证时它保存但是....它保存空字段
我真的不明白为什么它会变空,当我直接调用 JSOn 时,没有保存到数据库,在视图中它显示了我需要的所有内容,但现在我有这个......
在索引页上
然后在控制台中出现错误
我可以想象如何解决这个问题以及哪里出了问题
从我看来:
pars_json.each do |k|
art = ParserService.new('us')
res = response.body
art.title = res["title"]
art.save
end
这件作品是您要将其保存到数据库的地方吗?我不认为 ParserService 是您创建的反映数据库中 table 的模型。
如果您想使用 Article
模型来保存从 API 调用中解析的每个对象,您会想要做一些这样的事情而不是上面的事情:
pars_json.each do |k|
article = Article.create(title: k["title"], k["description"]...)
end
尝试首先打印出 k
的确切内容,然后排列对象键以对应正确的 Article
字段。
同样,要保存到数据库,您需要使用您创建的模型来反映数据库上的 table。如果您的数据库上有 articles
table,您希望在其中保存 API 响应数据,那么您应该创建 Article
的实例并保存它们。
然后在控制器中,它只是通过 @articles = Article.all
或您想要 运行 的任何查询调用它来获得您的文章列表。
我建议 运行 在后台作业中 ParserService
让 API 在并行进程中获取数据,而不会影响太多 rails 过程
需要将 httparty 响应保存到数据库并在视图文件中调用它
这就是 httrparty 得到的
在服务文件夹中/
class ParserService
include HTTParty
API_KEY = '882e10dd2b474a23bb7a3efa85e66b61'.freeze
base_uri 'https://newsapi.org/v2/'
default_params fielsd: "title, description, ulr, content"
format :json
def self.top_headlines(country_name='us')
new(country_name).top_headlines
end
def initialize(country_name='us')
@options = { query: { country: country_name, apiKey: API_KEY} }
end
def top_headlines
response = self.class.get("/top-headlines", @options)
pars_json = response.parsed_response
pars_json["articles"].each do |k|
@source = ActiveModel::Source.create(google_id: k["id"], name: k["name"])
@article = Article.create(title: k["title"], source_id: @source.id,
description: k["description"], content: k["content"])
end
end
end
文章控制器
class ArticlesController < ApplicationController
def index
@articles = Article.all
end
end
和型号
class Article < ApplicationRecord
belongs_to :source, class_name: "Source", optional: true
validates :title, presence: true
validates :source_id, uniqueness: true
end
和schema.rb
这就是我现在所做的 如果尝试在 (rails c) 控制台中保存文章有此错误,验证
当尝试评论验证时它保存但是....它保存空字段
我真的不明白为什么它会变空,当我直接调用 JSOn 时,没有保存到数据库,在视图中它显示了我需要的所有内容,但现在我有这个...... 在索引页上
然后在控制台中出现错误
我可以想象如何解决这个问题以及哪里出了问题
从我看来:
pars_json.each do |k|
art = ParserService.new('us')
res = response.body
art.title = res["title"]
art.save
end
这件作品是您要将其保存到数据库的地方吗?我不认为 ParserService 是您创建的反映数据库中 table 的模型。
如果您想使用 Article
模型来保存从 API 调用中解析的每个对象,您会想要做一些这样的事情而不是上面的事情:
pars_json.each do |k|
article = Article.create(title: k["title"], k["description"]...)
end
尝试首先打印出 k
的确切内容,然后排列对象键以对应正确的 Article
字段。
同样,要保存到数据库,您需要使用您创建的模型来反映数据库上的 table。如果您的数据库上有 articles
table,您希望在其中保存 API 响应数据,那么您应该创建 Article
的实例并保存它们。
然后在控制器中,它只是通过 @articles = Article.all
或您想要 运行 的任何查询调用它来获得您的文章列表。
我建议 运行 在后台作业中 ParserService
让 API 在并行进程中获取数据,而不会影响太多 rails 过程