Просто подытоживая то, о чем мы говорили в комментариях. Простейший способ выполнить то, что вам нужно, будет иметь представление, чтобы визуализировать виджет и контроллер маршрута + для обработки запроса на поиск.
Это все непроверенный код, но вы можете получить его суть.
# routes.rb
# this can be named and pointed to anywhere you want.
# It's using get just so you can see the search params in the url, which is preety common for the search feature.
get '/search', to: 'searches#show', as: 'search'
# models/search.rb
# Your PORO
class Search
attr_reader :results
def initialize(query)
# perform request and assign results
@results = HTTParty.get(url, query: { keyword: query })
end
end
# controllers/searches_controller.rb
def show
if params[:query]
@search = Search.new(params[:query])
end
end
# views/searches/show.html.erb
<%= form_tag search_path, method: :get do %>
<%= text_field_tag :query, params[:query] %>
<%= submit_tag %>
<% end %>
# .... renders contents if they're present.
<%= @search.results if @search %>
Что можно дополнительно сделать, это включить поиск в модель, так что наследование будет Нейминг и вы могли бы иметь дело с ним, как обычный ресурс.
# routes.rb
# A singular resource will do.
resource :search, only: [:show]
# models/search.rb
include ActiveModel::Model
attr_reader :results
attr_accessor :query
validates :query, presence: true
def perform
@results = HTTParty.....
end
# controllers/searches_controller.rb
def show
if search_params = params[:search] && params[:search][:query]
@search = Search.new(query: search_params)
@search.perform if @search.valid?
else
@search = Search.new
end
end
# views/searches/show.html.erb
<%= form_for @search, method: :get do |f| %>
<%= f.text_field :query %>
<%= f.submit %>
<% end %>
<%= @search.results %>
Теперь ... Вы, вероятно, хотите, чтобы сделать ваш виджет везде и не только в/поиска, так что вы можете извлечь форму в частично и вынести его в application.html.erb.
Если вы воспользовались подходом ActiveModel, не забудьте инициализировать @search в каждом запросе, который вы визуализируете. Вы можете использовать для этого before_action
.
Как вы хотите, чтобы пользователь взаимодействовал с виджетами? Готовы ли вы перезагрузить всю страницу после того, как пользователь представит свои параметры поиска? На мой взгляд, виджет - это то, что вы делаете исключительно с JS, напрямую запрашивая api и рендеринг результатов на месте, не проходя через ruby. Но если вы должны разобрать ответ в рубине, прежде чем представить его в представлении, вам придется отправить параметры поиска на ваш контроллер, используя обычный запрос или ajax. –
Возможно, виджет был неправильным термином. Я хочу перезагрузить страницу после отправки параметров поиска. Я просто не знаю, как лучше всего это сделать. Использование form_for предлагает форму для конкретной модели, которая не работает в этом случае. – stoerebink
Вы можете попробовать с помощью 'form_tag', который не привязан к модели. http://api.rubyonrails.org/classes/ActionView/Helpers/FormTagHelper.html –