2009-08-07 1 views
3

В моем приложении пользователи выбирают железнодорожные станции из текстового поля автозаполнения. Поскольку на вокзале не так много станций (~ 100), я бы предпочел, чтобы поле было автозаполнено на основе содержимого клиентского массива, а не запрашивало сервер каждый раз, когда пользователь вводит символ (цель состоит в том, чтобы сделать автозаполнение более отзывчивое).Autocomplete с локальными данными в Rails

Мой вопрос заключается в том, как это сделать в Rails в поддерживаемом, небедовом режиме. Мое текущее решение просто положить эту линию в нижней части index.html.erb:

<%= javascript_tag "var stations = #{Station.all.map {|s| s.name}.to_json}" %> 

, но это не большой (для одной вещи, я должен помнить «станции» имя переменной, а я работаю над application.js) ,

ответ

1

В приложении application.js, на готовом документе, выполните вызов ajax, чтобы заполнить локальный массив значениями.

document.observe("dom:loaded", function() { 
    var stations; 
    new Ajax.Request(url, { 
    method: 'get', 
    onSuccess: function(transport) { 
     stations = transport.responseText; 
    } 
    }); 
}); 

Мой пример может не работать идеально (как я использую jQuery через jrails сейчас), но это должно дать правильное впечатление.

2

Вы можете создать файл с поддержкой Javascript, похожий на how I show here.

В принципе, если у вас есть действие контроллера (например, действие станций контроллера javascripts). Это может выглядеть так.

# in controllers/javascripts_controller.rb 
def stations 
    @stations = Station.all 
end 

, то вы можете сделать вид JavaScript-файл, как это ...

// in views/javascripts/stations.js.erb 
var stations = <%= @stations.map(&:name).to_json %>; 
// ... 

Это Java-файл может содержать любые Javascript вы хотите, так что вы, вероятно, можете переместить некоторые из application.js кода там. Затем вы можете включить это, как и любой другой файл javascript.

<%= javascript_include_tag 'stations' %> 

Это предполагает, что он находится под путем «JavaScripts», который случается в случае, если у вас есть контроллер JavaScripts. В противном случае вам придется пройти полный путь.

Это имеет недостаток, сделав еще один запрос к Rails-приложению, но вы можете добавить к нему действие js для оптимизации этого.

+0

Проблема заключается в том, что вы можете поместить код на стороне сервера в общедоступное место. –

+0

Файл с картинками station.js.erb не находится в общем каталоге. Он находится под представлениями с другими шаблонами. Таким образом, вы не рискуете разоблачить его, как и любой другой шаблон. – ryanb

+0

Должен ли этот ответ по-прежнему работать? Кажется, я не могу заставить его работать: \ – jon