Проблема с rails3-jquery-автозаполнение

#jquery #ruby-on-rails #ruby #ruby-on-rails-3 #rubygems

#jquery #ruby-on-rails #ruby #ruby-on-rails-3 #rubygems

Вопрос:

Я пытаюсь связать две модели вместе с помощью has_many и belongs_to наряду с использованием rails3-jquery-autocomplete, но, похоже, я не могу заставить его извлекать какие-либо данные из vocab таблицы.

Я пытаюсь автоматически заполнить поле «навыки» данными из таблицы «vocab». Я могу отправлять навыки просто отлично, и они должным образом сохраняются в таблице «навыки», автозаполнение — единственное, что меня беспокоит.

Я был бы признателен за любую помощь. Я сократил свой код только до соответствующего кода. В качестве примечания, у меня действительно правильно установлен плагин, html выводит соответствующие теги JS и input.

Заранее спасибо 🙂 Любая помощь приветствуется.

users_controller.rb

 class UsersController < ApplicationController

autocomplete :vocab, :name

  def new
    @user = User.new
    3.times do
        skill = @user.skills.build
    end
  end

end
  

user.rb

 class User < ActiveRecord::Base     
    has_many :skills, :dependent => :destroy
    accepts_nested_attributes_for :skills       
end
  

skill.rb

 class Skill < ActiveRecord::Base   
  belongs_to :user
end
  

_form.html.erb

 <%= form_for(@user) do |f| %>
  <% f.fields_for :skills do |builder| %>
    <%= render "skill_fields", :f => builder %>
  <% end %>
  <div class="actions">
    <%= f.submit %>
  </div>
<% end %>
  

_skill_fields.html.erb

 <p>
  <%=f.label :skill_name, "Skill" %>
  <%=f.autocomplete_field :skill_name, users_autocomplete_vocab_name_path %>
</p>
  

routes.rb

 MyApp::Application.routes.draw do
  get 'users/autocomplete_vocab_name'
end
  

База данных

 user
  -id

skills
  -user_id
  -skill_name

vocab
  -name
  

Ответ №1:

просто как идея .. :

похоже, что в вашем коде есть несколько полей автозаполнения :

 <%=f.autocomplete_field :skill_name, users_autocomplete_vocab_name_path %>
  

если все эти поля имеют одинаковые атрибуты html ‘id’ и ‘name’ (что, скорее всего, и происходит), js может не получить нужное вам поле.

Итак, просто для пояснения: 1. В журнале вашего сервера вы видите, что запрос действительно достигает вашего контроллера? (users_autocomplete_vocab_name_path) 2. Что-нибудь изменится, если вы оставите в своем представлении только одно поле автозаполнения?

Просто небольшое замечание. Если у вас в вашем приложении менее 100-200 навыков, вы могли бы вывести все это в виде json в какой-нибудь скрытый div, проанализировать его с помощью jquery и заставить автозаполнение работать локально. Это будет работать быстрее, и вы избежите дополнительных запросов к вашему веб-серверу и базе данных. Некоторое время назад мне пришлось реализовать ту же функциональность (автозаполнение имен друзей пользователя). Я сделал так, что если у пользователя менее 250 друзей — автозаполнение локально, в противном случае — автозаполнение с сервера. Кстати, я использовал jquery-автозаполнение пользовательского интерфейса, действительно хорошая вещь, если вам нравится javascript 🙂

Комментарии:

1. Спасибо, Влад — я попробую. К сожалению, у нас будет более 10 000 записей, поэтому локальное использование не вариант :/

2. Оказывается, я идиот. Я использовал поврежденный файл jQuery. Блин.