【问题标题】:How to select data from API call result in rails?如何从 Rails 中的 API 调用结果中选择数据?
【发布时间】:2023-03-09 04:05:01
【问题描述】:

我对 ruby​​ on rails 完全陌生,我正在创建一个简单的文章搜索应用程序,该应用程序将使用 Guardian API 并仅显示新闻标题。它只需要像这样工作:用户进入页面,填写搜索表单并查看新闻标题。

我想简单地选择请求结果的“webTitle”键并将它们的值显示为列表项,但我得到了大量数据,我不知道该怎么做。

这是请求结果:

{"response"=>{"status"=>"ok", "userTier"=>"developer", "total"=>2153270, "startIndex"=>1, "pageSize"=>10, "currentPage"=>1, "pages"=>215327, "orderBy"=>"relevance", "results"=>[{"id"=>"books/2017/jul/16/fall-down-7-times-get-up-8-naoki-higashida-review-autism", "type"=>"article", "sectionId"=>"books", "sectionName"=>"Books", "webPublicationDate"=>"2017-07-16T06:00:13Z", "webTitle"=>"Fall Down 7 Times Get Up 8 review – a window on the world of autism", "webUrl"=>"https://www.theguardian.com/books/2017/jul/16/fall-down-7-times-get-up-8-naoki-higashida-review-autism", "apiUrl"=>"https://content.guardianapis.com/books/2017/jul/16/fall-down-7-times-get-up-8-naoki-higashida-review-autism", "isHosted"=>false, "pillarId"=>"pillar/arts", "pillarName"=>"Arts"}, {"id"=>"football/2017/jul/07/gold-cup-2017-predictions-usa-mexico-costa-rica-football", "type"=>"article", "sectionId"=>"football", "sectionName"=>"Football", "webPublicationDate"=>"2017-07-07T09:00:08Z", "webTitle"=>"Gold Cup picks: USA to tip under-strength Mexico and in-form Costa Rica", "webUrl"=>"https://www.theguardian.com/football/2017/jul/07/gold-cup-2017-predictions-usa-mexico-costa-rica-football", "apiUrl"=>"https://content.guardianapis.com/football/2017/jul/07/gold-cup-2017-predictions-usa-mexico-costa-rica-football", "isHosted"=>false, "pillarId"=>"pillar/sport", "pillarName"=>"Sport"}, {"id"=>"world/2017/jul/15/stream-of-floating-bodies-near-mosul-raises-fears-of-reprisals-by-iraqi-militias", "type"=>"article", "sectionId"=>"world", "sectionName"=>"World news", "webPublicationDate"=>"2017-07-15T08:00:01Z", "webTitle"=>"Stream of floating bodies near Mosul raises fears of reprisals by Iraqi militias", "webUrl"=>"https://www.theguardian.com/world/2017/jul/15/stream-of-floating-bodies-near-mosul-raises-fears-of-reprisals-by-iraqi-militias", "apiUrl"=>"https://content.guardianapis.com/world/2017/jul/15/stream-of-floating-bodies-near-mosul-raises-fears-of-reprisals-by-iraqi-militias", "isHosted"=>false, "pillarId"=>"pillar/news", "pillarName"=>"News"}]}}

API 消费者类:


#app/clients/guardian_api_client.rb

class GuardianApiClient
  include HTTParty  

  API_KEY = ENV['GUARDIAN_CONTENT_API_KEY']
  BASE_URL ="https://content.guardianapis.com/search?" 
  API_PARTIAL_URL = "api-key=#{API_KEY}"


  def query(q)
      request = HTTParty.get(BASE_URL+"q=#{q}&""api-key=#{API_KEY}")
      puts request
      request
  end
end

控制器:


class SearchController < ApplicationController
    def search
        @app = GuardianApiClient.new
        @results = @app.query(params[:q])
    end
end

查看:

<%= form_with(url: '/search') do |f| %>
<%= f.text_field :q %>
<%= f.submit 'search' %>
<% end %>

<% if @results != nil %>
  <ul>
  <%= @results.each do |r| %>
  <li><%= r["webTitle"] %></li>
  <% end %>
  </ul>
<% else %>
  <p>No results yet</p>
<% end %>

路线:


Rails.application.routes.draw do
  get '/search' => 'search#search'
  post '/search' => 'search#search'
end

【问题讨论】:

    标签: html ruby-on-rails ruby


    【解决方案1】:

    响应是一些 JSON,因此您需要学习如何映射它并获得您想要的结果。

    要更清楚地查看数据,请尝试使用以下命令打印:

    puts JSON.pretty_generate(@results)

    在您的控制器中,然后在您的 rails 控制台中查看输出。

    无论如何,你有几个选择:

    选项 1:您可能只需要在您的视图中进一步深入了解@results。在返回的 JSON 中,webTitles 是嵌套的,因此更改下面的第三行应该可以工作。另请注意,我删除了 = 符号以防止显示返回值。

    <% if @results != nil %>
      <ul>
      <% @results["response"]["results"].each do |r| %>
      <li><%= r["webTitle"] %></li>
      <% end %>
      </ul>
    <% else %>
      <p>No results yet</p>
    <% end %>
    

    选项 2: 您可以考虑在您的 控制器 中获取文章列表,我认为这是您的初衷,也可能更像是“轨道”,例如:

    class SearchController < ApplicationController
        def search
            @app = GuardianApiClient.new
            @results = @app.query(params[:q])
            @articles = @results["response"]["results"].map do |article|
                article
            end
        end
    end
    

    在您的视图中,然后调用渲染部分:

    <%= render 'articles' %>
    

    然后在另一个视图所在的目录中创建一个名为_articles.html.erb部分视图,然后添加一些代码来显示每篇文章:

    <ul>
      <% @articles.each do |article| %>
        <li><%= article["webTitle"] %> <% link_to 'Link', article["webUrl"] %></li>
      <% end %>
    <ul>
    
    

    通过分离@articles 数组中返回的每篇文章,您可能会更容易以更易读的方式获取其他属性。如您所见,上面我包含了指向实际文章的链接。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-27
      • 2020-11-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多