На "нормальном" сайте рельсов форма поиска работает следующим образом -
Вы определяете форму в представлении.По умолчанию это POST
данные для конечной точки, но вы также можете сделать это с помощью запроса GET
.В вашем случае вы изначально выбрали:
form_tag("/search", method: "get")
Это отправит данные формы в GET /search
синхронно и, следовательно, выполнит полную перезагрузку страницы.
Это совершенно правильная вещьсделать.Однако вы хотели, чтобы оставался на странице индекса - поэтому запрос должен быть асинхронным:
form_tag("/search", method: "get", remote: true)
... Но теперь эта конечная точка должна сделать что-то другое.Вместо рендеринга новой страницы необходимо частично обновить текущую страницу .
Стандартный подход для этого в приложении rails состоит в следующем:
# In the controller action, e.g. SearchController
def show
@results = # ...
respond_to do |format|
format.js {render layout: false}
end
end
# In the view, e.g. `search/show.js.erb`
$("#display_result").html("<%= escape_javascript(render partial: 'results', locals: { results: @results } ) %>");
# In an HTML partial, e.g. `search/_results.html.erb`
<% results.each do %>
...
Основная идея заключается в том, что на главной странице (index.html.erb
?) У вас должен быть контейнер для отображения результатов.Затем вместо рендеринга новой страницы вы просто визуализируете обновление HTML внутри этого контейнера.
Это, конечно, не единственный способ сделать это.Современные веб-сайты часто вместо этого извлекают данные JSON для результатов поиска и затем определяют, как их отображать с помощью JavaScript.
Однако вышеупомянутый подход является наиболее «минимальным» изменением по сравнению с вашим текущим дизайном - без необходимости добавлять дополнительныеПри разработке шаблонов вы можете оставить большинство существующих шаблонов haml
/ erb
как есть и просто добавить небольшой код для визуализации результатов как частичного.