Нумерация результатов поиска с помощью kaminari и ajax

Я работаю над приложением Rails 5 с mongoid и kaminari.

Само приложение будет содержать несколько текстов от 2 разных исследовательских групп и предоставлять различные функции для каждой. (Один из них - это тот "баталь", который вы увидите там.)

Одной из функций является поиск текста или некоторых частей текста, но это не проблема. Я уже могу успешно искать и показывать результаты. Проблема заключается в разбиении этих результатов на страницы.

Моя нумерация страниц работает при отображении всех текстов, касающихся действия index, я реплицировал решение index.js.erb в документах kaminari, но я не могу понять, что будет искать файл js, так как у меня другое действие на моем контроллер. Я добираюсь до первого маршрута (здесь) и на самом деле получаю результаты от моего контроллера, но когда маршрут идет "/ batale / text / search '? Params...'", я не могу найти фактический файл js, который rails будет искать. Я пытался создать файл js в тех местах, которые, как мне казалось, он будет искать (например, /batale/texts/search.js или /batale/texts/search/search.js), но безуспешно.

Вот некоторые из моих файлов:

# in routes.rb
Rails.application.routes.draw do
  devise_for :users, :controllers => {:registrations => "user/registrations"}

  get '/batale/texts/search', to: "batale/texts#search"
  # I tried this also
  # get '/search_batale_texts', to: "batale/texts#search"
  namespace :batale do
    resources :texts
  end
  # and other routes...
end

---

# in batale/texts/index.html.erb
<%= render "batale/texts/search_texts" %>

<div id="pagination-itens">
   <%= render partial: "batale/texts/list_texts" %>
</div>

---

# in batale/texts/_search_texts.html.erb
<%= form_tag batale_texts_search_path, remote: true, method: :get, id: 'batale_text-search-form' do %>
  ...all my regular labels and inputs...
  <%= button_tag(type: :submit, class: "my-classes...") do %>
            search
  <% end %>
  #nothing special
<%= end %>

---

#in /views/batale/texts/_list_texts.html.erb
<% @batale_texts.each do |batale_text| %>
  actually displays the content and stuff
<% end %>

<div id="paginator" align="center"><%= paginate(@batale_texts, remote: true) %></div>

<script>
some little js just to use accordion on the texts
</script>

---

# in /views/batale/texts/index.js.erb
$("#pagination-itens").empty();
$("#pagination-itens").append("<%= escape_javascript render 'batale/texts/list_texts' %>");
$("#paginator").html("<%= escape_javascript(paginate(@batale_texts, remote: true)).to_s %>");

---

#assets/javascripts/batale/texts.js
var init_batale_text_search;
init_batale_text_search = function(){
  $('#batale_text-search-form').on("ajax:before", function(event, data, status){
    $('#pagination-itens').empty();
    $('#batale_text-search-errors').empty();
    show_spinner();
  });

  $('#batale_text-search-form').on("ajax:complete", function(event, data, status){
    hide_spinner();
  });

  $('#batale_text-search-form').on('ajax:success', function(event, data, status){
    $('#pagination-itens').html(data);
  });

  $('#batale_text-search-form').on('ajax:error', function(event, xhr, status, error){
    hide_spinner();
    $('#pagination-itens').html(" ");
    $('#batale_text-search-errors').html("Something went wrong.");
  });
}

$(document).ready(function(){
  init_batale_text_search();
});

---

# in controllers/batale/texts_controller.rb
class Batale::TextsController < ApplicationController
  before_action :set_batale_text, only: [:show, :edit, :update, :destroy]

  def index
    @batale_texts = Batale::Text.all.page(params[:page]).per(5)
  end

  def search
    @batale_texts = Batale::Text.search(params).page(params[:page]).per(5)

    if @batale_texts.count > 0
      render partial: "batale/texts/list_texts"
    else
      render status: :not_found, nothing: true
    end
  end
  #other regular actions...
end

0 ответов

Другие вопросы по тегам