【问题标题】:How do I interact with an external search API in Rails5 using the HTTParty gem?如何使用 HTTParty gem 与 Rails5 中的外部搜索 API 交互?
【发布时间】:2019-01-22 13:23:44
【问题描述】:

如何在 Rails 中创建一个应用程序,让我输入搜索参数,然后将这些参数传递给外部 API 以执行搜索,然后在我的应用程序中显示这些结果。我正在尝试使用 HTTParty 来实现这一点,但我有点迷茫。我尝试在 app/services 中创建一个类方法并在我的控制器中访问它,然后在我的视图中调用实例变量。目前它正在引发路由错误uninitialized constant ResultsController::Api。非常感谢您的帮助。

服务/Api.rb

class Api
  include HTTParty
  base_uri "search.example.com"
  attr_accessor :name

  def initialize(name)
    self.name = name
  end

  def self.find(name)
    response = get("/results&q=#{name}")
    self.new(response["name"])
  end

results_controller.rb

class ResultsController < ApplicationController
  include Api

  def index
    @results = Api.find('test')
  end
end

路线:

Rails.application.routes.draw do
  resources :results
  root 'results#index'
end

【问题讨论】:

  • ResultsController 中声明include Api 的目的是什么?
  • 是的,我现在看其实没必要
  • 您的错误实际上在哪里。 Api 不是包含它的模块,它需要在 app/services/api.rb 下(请记住,Ruby 文件的命名约定使用小写下划线名称)以便 Rails 可以自动加载它。

标签: ruby-on-rails ruby api httparty


【解决方案1】:

您几乎是对的,只是需要在此处进行一些更改。首先,将Api.rb 重命名为api.rb - 按照惯例,所有文件都应以小写蛇命名

class Api
  include HTTParty
  base_uri "http://search.spoonflower.com/searchv2"

  def find(name)
    self.class.get("/designs", query: { q: name }).parsed_response
  end
end

class ResultsController < ApplicationController    
  def index
    # here you get some json structure that you can display in the view
    @results = Api.new.find('test')['results']
  end
end

【讨论】:

  • 非常感谢 :) 这解决了错误问题。如果我在我看来调用@results 应该返回什么格式?我得到了很多 html 和 css,而不是查询的搜索结果。
  • 如果有帮助,请随时接受答案:) 您的 API 应该能够以 JSON 格式返回搜索结果。检查api的文档,也许你需要get("/results.json", query: { q: name })
  • 它似乎没有返回 json,只是“您正在寻找的页面不存在 (404)”的大量 html 标签奇怪。添加 .json 也不起作用并引发错误。遗憾的是没有 api 文档:(
  • 状态 404 表示您访问了错误的网址。如果您发布真正的 API url,我可以尝试提供帮助
  • 它返回非常好的JSON。你为什么要尝试点击“/results”?如果base_urisearch.spoonflower.com/searchv2,它应该是“/designs”
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-09-13
  • 1970-01-01
  • 2020-04-28
  • 1970-01-01
  • 2014-03-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多