2015-11-23 3 views
2

Я пытаюсь создать простую форму поиска, которая отвечает на AJAX на моем приложении Rails 4.2. Я попытался найти каждый учебник, который я смог найти, но все равно безуспешно.Как добавить живой поиск в Rails 4.2?

Это мой способ поиска:

def self.search(search) 
    search ? where('name LIKE ?', "%#{search}%") : all 
    end 

Мой индекс действия на контроллере:

# GET /ticket_types 
    # GET /ticket_types.json 
    def index 
    @ticket_types = TicketType.search(params[:search]).order(sort_column + " " + sort_direction).paginate(per_page: 10, page: params[:page]) 
    respond_to do |format| 
     format.html {render 'index'} 
     format.json {render json: @ticket_types.map(&:name)} 
    end 
    end 

Мой фильтр:

<form> 
    <fieldset> 
     <legend>Filter</legend> 
     <%= form_tag path, remote: true, method: 'get', id: id do %> 
      <%= hidden_field_tag :direction, params[:direction] %> 
      <%= hidden_field_tag :sort, params[:sort]%> 
      <p> 
      <%= text_field_tag :search, params[:search], id: 'filter_search_autocomplete', data: {autocomplete_source: ticket_types_path} %> 
      <%= render 'button_submit', name: nil, id:"search_button" %> 
      </p> 
     <% end %> 
     </fieldset> 
    </form> 

Кнопку Submit:

<%= submit_tag "Search", name: name, class: 'button', id: id, remote: true %> 

Мой ticket_types.coff и ее

jQuery -> 
    $('#filter_search_autocomplete').autocomplete 
    source: $('#filter_search_autocomplete').data('autocomplete-source') 

И мой индекс парциального:

<p id="notice"><%= notice %></p> 

<%= render 'registry_filter', path: ticket_types_path, id: "ticket_search_filter" %> 
<%= render 'ticket_types' %> 
<br> 
<section id="content-area"></section> 
<div> 
    <%= render 'button_link', button_name: "Create", path: new_ticket_type_path, id: 'create' %> 
    <%= render 'button_link', button_name: "Back", path: ticket_types_path, id: 'back_button' %> 
</div> 

Любые идеи о том, как я мог бы иметь коробку livesearch как Facebook? Например, я хотел бы, чтобы каждый раз, когда пользователь вводил письмо в поле, он показывал около 5 результатов реестров, содержащих данное слово, а затем использовал этот ресурс поиска как частичный, чтобы иметь возможность использовать на других моделях приложение. Заранее спасибо!

+0

Ну, прежде всего, я бы рекомендовал использовать какой-то бэкэнд, такой как ElasticSearch, если вы знаете об ElasticSearch, тогда дайте мне знать, я напишу вам ответ. – SsouLlesS

ответ

2

Я сделал что-то по линиям, которые очень похожи на то, что вы пытаетесь выполнить.

Если вы храните все в базе данных, то одна из вещей, которые я бы сделал, - это преобразовать данные в json в ваш контроллер рельсов.

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

Внизу ниже вы должны передать путь объекта json к вашему параметру данных.

Пример: <%= f.text_field :some_name, data: {autocomplete_source: some_name_path} %>

В контроллере вы должны сделать что-то вроде этого. Заказ и Где можно было бы объявить в вашей модели (предпочтительный вариант) в качестве областей.

def index 
    @some_name = SomeName.order(:field_name).where("feild_name like ?", "%#{params[:term]}%") 

    respond_to do |f| 
     f.json { render json: @some_names.map(&:field_name) } 
    end 
    end 

Инструмент я после того, как выше было реализовано было: autocomplete

Надежда выше помогает. Если не этот эпизод railscast, вы должны идти в правильном направлении.

+0

Спасибо @coletrain! Было предложено использовать предыдущий railscast для запуска автозаполнения: [link] (http://railscasts.com/episodes/102-auto-complete-association-revised), мне удалось заставить его работать так, как ожидалось, когда он загрузил все это на странице, но не смог заставить его работать, когда собирал данные из базы данных, он показывает все реестры в базе данных, а не только те, которые соответствуют указанным символам, я обновляю вопрос до отражают сделанные изменения. –

+0

@FilipeGorgesReuwsaat Я обновил свой ответ на примере того, как вытащить данные json. – coletrain

+0

Еще раз спасибо @coletrain, я сделал то, что вы сказали, и теперь все работает как ожидалось;) –

Смежные вопросы