【问题标题】:How to save HTTParty response to db?(Update!)如何将 HTTParty 响应保存到 db?(更新!)
【发布时间】:2019-04-16 11:24:36
【问题描述】:

需要将httparty响应保存到db并在视图文件中调用

这就是 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 而不保存到数据库时,它显示了我需要的所有内容,但现在我有了这个...... 在索引页上

后来在控制台出现错误

我可以想象如何解决这个问题以及哪里出了问题

【问题讨论】:

  • 你能告诉我们你卡在哪里了吗:)
  • @Manoj 文章现在显示在页面上,但每次刷新页面时它都会调用 API 方法,我想将其保存到数据库并从数据库调用它。坚持保存到数据库

标签: ruby-on-rails ruby httparty


【解决方案1】:

在我看来:

pars_json.each do |k|
  art = ParserService.new('us')
  res = response.body
  art.title = res["title"]
  art.save
end

这件作品是您试图将其保存到数据库的地方吗?我不认为 ParserService 是您创建的模型,它反映了您的数据库中的表。

如果您想要使用 Article 模型来保存从 API 调用解析的每个对象,那么您会想要做一些类似的事情而不是上面的:

pars_json.each do |k|
  article = Article.create(title: k["title"], k["description"]...)
end

尝试首先打印出k 的确切含义,然后将对象键排列为对应于正确的Article 字段。

同样,要保存到数据库,您需要使用您创建的模型来反映数据库上的表。如果您的数据库中有articles 表,您想在其中保存您的API 响应数据,那么您应该创建Article 的实例并保存它们。

然后在控制器中它只是通过@articles = Article.all 或您想要运行的任何查询来调用它以获得您的文章列表。

我建议在后台作业中运行 ParserService 以让 API 在并行进程中获取数据,而不会对 rails 进程造成太大影响

【讨论】:

  • 我认为这是我需要的,但我应该把这个保存方法放在哪里才能工作?我真的不了解它是否在某个地方或什么地方调用,因为现在它确实保存到 DB anithing。如果我将所有代码都放在类中并将其放入文章模型中,它仍然不起作用
  • 它几乎可以工作,但出现此错误 ActiveRecord::AssociationTypeMismatch: Source(#70117389054060) 预期,得到 {"id"=>nil, "name"=>"Espn.com"} 这是一个哈希实例(#47345000114540)
  • 您能否使用您尝试运行的生成ActiveRecord::AssociationTypeMismatch 的代码更新您的问题?我认为可能是您将 api 调用中的 source_id 作为整数内的字符串传入。例如:(source_id: k['id']) k['id'](来自 api 的 id) 应该被强制转换为整数正在做k['id'].to_i .. 但在您更新之前我无法验证这一点:)
  • 所以当您Article.create! 进行验证时,您将有一个不允许您保存它的回滚(第一个示例),而在第二个示例中它确实保存了,因为您没有进行验证以验证您的 Article 是否需要填充字段。当您创建 Article.create! 时,您也没有向其中添加任何字段。您没有添加任何内容,因此这些字段将为空白。如果您想添加字段,则必须执行 Article.create!(tittle: "This is my article title", description: "This is the description of the article) 并包括必须存在的任何其他字段。
猜你喜欢
  • 2019-02-25
  • 1970-01-01
  • 2017-07-27
  • 2015-07-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多