Сначала создайте потребительский класс 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 %>