Как отобразить данные вызовов API рельсов? - PullRequest
0 голосов
/ 12 ноября 2019

Я совершенно новичок в рельсах, я хочу создать простое приложение для поиска статей, которое будет использовать Guardian API и просто отображать заголовки новостей. У меня есть готовая модель, отвечающая за запросы, но я не знаю, как создать контроллер и представление с формой поиска, которая заставит модель отображать искомые заголовки. Просто нужно работать так: пользователь заходит на страницу, заполняет форму поиска и просматривает заголовки новостей. Я использую httparty gem.

Файл модели:


class GuardianApi < ApplicationRecord

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

    def query
        request = HTTParty.get(BASE_URL+@search_format+API_PARTIAL_URL).to_json
        @request_hash = JSON.parse(request)
    end

    def initialize(user_search_input)
        @search_format = "q=#{user_search_input.gsub(" ", "%20")}&"
    end

    def print_titles
        @request_hash["response"]["results"].each do |article|
            puts article["webTitle"]
        end
    end
end

1 Ответ

0 голосов
/ 12 ноября 2019

Сначала создайте потребительский класс API:

# app/clients/guardian_api_client.rb
class GuardianApiClient
  include HTTParty
  base_uri 'https://content.guardianapis.com'
  format :json

  def initialize(**options)
    @options = {
      "api-key" => ENV['GUARDIAN_API_KEY']
    }.merge(options)
  end

  def search(q)
    response = self.class.get('/search', @options.merge(
      q: q
    ))
    if response.success?
      response["results"]
    else
      [] # @todo add error handling
    end
  end
end

Это не совсем модель, скажем так. Скорее это класс, который выполняет одну работу - общение с внешним API. Это позволяет легко издеваться над тестами. Также вы включаете HTTParty в свой класс, но вы все еще используете его неуклюжим процедурным способом, что делает его довольно бессмысленным. Если вы хотите сделать процедурный, просто используйте Net :: HTTP и пропустите накладные расходы.

Затем форма для создания поискового запроса:

# app/views/search/search.html.erb
<%= form_with(url: '/search') do |f| %>
  <%= f.text_input :q %>
  <%= f.submit 'search' %>
<% end %>

И контроллер для его обработки:

class SearchController
  # GET /search
  def search
    @results = GuardianApiClient.new.search(params[:q])
  end
end

Затем вы можете перечислить результаты в представлении:

<%= if @results.any? %>
  <ul>
  <% @results.each do |r| %>
    <li><%= r["webTitle"] %></li>
  <% end %>
  </ul>
<% else %>
  <p>No results</p>
<% end %>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...