如何将 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 过程