Как исправить неопределенный метод form_with в моей строке поиска при построении глобального поиска с автозаполнением?

Я получаю странную ошибку при попытке запустить глобальный поиск с автозаполнением по нескольким моделям в моем приложении rails и использовать библиотеку jquery для простого автозаполнения вместе с жемчужиной для поиска.

В частности, я считаю, что ошибка находится на моей странице панели навигации, поскольку я получаю эту ошибку, когда пытаюсь запустить запрос- undefined method form_with for #<#<class:0x007f875a6f8b58>:0x007f87600e0aa8>

Я решил взломать и переключить form_with на form_tag, но затем я получаю сообщение об ошибке в строке сразу после undefined method text_field for nil:NilClass". Я перечислил весь свой соответствующий код ниже. Большое спасибо за любую помощь.

Main_Controller.rb

class MainController < ApplicationController
def index
end
def search
@movies    = Movie.ransack(name_cont: params[:q]).result(distinct: true)
@directors = Director.ransack(name_cont: params[:q]).result(distinct: true)

respond_to do |format|
  format.html {}
  format.json {
    @movies    = @movies.limit(5)
    @directors = @directors.limit(5)
  }
end
end
end

_navbar.html.erb

<%= form_with url: search_path, local: true, method: :get, html: { class: "form-inline my-2 my-lg-0" } do |form| %>
  <%= form.text_field :q, placeholder: "Search", data: { behavior: "autocomplete" }, class: "form-control mr-sm-2" %>
  <%= form.button "Search", class: "btn btn-outline-success my-2 my-sm-0" %>
<% end %>

search.html.erb

<div class="row">
<div class="col">
<h1>Movies</h1>
<% @movies.each do |movie| %>
  <p><%= link_to movie.name, movie %></p>
<% end %>
</div>
<div class="col">
<% @directors.each do |director| %>
  <p><%= link_to director.name, director %></p>
<% end %>
</div>
</div>

search.js

document.addEventListener("turbolinks:load", function() {
$input = $("[data-behavior='autocomplete']")
var options = {
getValue: "name",
url: function(phrase) {
  return "/search.json?q=" + phrase;
},
categories: [
  {
    listLocation: "movies",
    header: "<strong>Movies</strong>",
  },
  {
    listLocation: "directors",
    header: "<strong>Directors</strong>",
  }
],
list: {
  onChooseEvent: function() {
    var url = $input.getSelectedItemData().url
    $input.val("")
    Turbolinks.visit(url)
  }
}
}
$input.easyAutocomplete(options)
});

person Omar    schedule 15.06.2017    source источник
comment
Если вы замените form_with на form_tag, просто убедитесь, что вы удалили |form| после делать. И таким же образом замените form.text_field на text_field_tag   -  person Maxence    schedule 16.06.2017
comment
На самом деле вы используете form_with как смесь form_for и form_tag, и это конфликтует. Поскольку у вашего form_with нет связанного с ним объекта или переменной, только ссылка.   -  person Maxence    schedule 16.06.2017
comment
@Maxence, большое спасибо за ответ, очень ценю это. Немного потерян из-за вашего второго ответа - это всего лишь ссылка, поскольку мой search.js использует JSON и URL-адрес при выполнении запроса.   -  person Omar    schedule 16.06.2017
comment
Простите за это. Я имел в виду, что ваш form_with имеет ссылку только на нужный контроллер. У него нет объекта, такого как :search, или переменной экземпляра, такой как @search. В этом случае вы должны использовать вспомогательные теги внутри тела формы (например, text_field_tag ​​или submit_tag). Вы должны прочитать это: guides.rubyonrails.org/ и вы поймете разницу между form_for и form_tag (form_with — это новый синтаксис в Rails 5.1+, который группирует оба помощника)   -  person Maxence    schedule 16.06.2017
comment
в случае вашей формы поиска нет необходимости применять переменную объекта или экземпляра, поэтому вы должны использовать form_with, как если бы это был старый добрый form_tag. Вы не можете создать |форму| временная константа в этом случае, так как в вашей структуре базы данных нет модели search.   -  person Maxence    schedule 16.06.2017


Ответы (1)


В вашем файле gem измените rails gem на последнюю версию: gem 'rails', '~> 5.1.1' или выше. console: bundle update. Перезапустите приложение rails. Надеюсь, это сработает для вас.

person Charlie    schedule 17.06.2017
comment
Большое спасибо, Чарли!! Это сработало отлично :) Хорошего дня! - person Omar; 18.06.2017