Автозаполнение текстового поля
Проблема
Вам наверняка приходилось пользоваться изящной работой элементов управления, обладающих свойством автозаполнения. Вы точно знаете, стоит только приступить к вводу данных, как приложение еще до завершения ввода начнет динамический подбор соответствий. Это был самый впечатляющий писк моды в девяностых годах прошлого столетия.
Для нового, сногсшибательного приложения вполне естественно желание оформить стильный поиск.
Решение
В Rails имеется удивительно простой в использовании элемент управления с автозаполнением, который является частью JavaScript-библиотеки script.aculo.us. С его помощью можно вполне справиться с задачей и получить привлекательное, современное поле поиска менее чем в десяти строчках кода.
Представьте, что у вас есть приложение контактная книга и желание быстрого поиска контакта по имени. Предположим, что все необходимые таблицы базы данных и классы модели уже созданы, а миграция Active Record для создания таблиц выглядит следующим образом:
-
class CreateContacts < ActiveRecord::Migration
-
def self.up
-
create_table :contacts do |t|
-
t.column :name, :string
-
t.column :email, :string
-
t.column :phone, :string
-
t.column :address_line1, :string
-
t.column :address_line2, :string
-
t.column :city, :string
-
t.column :state, :string
-
t.column :country, :string
-
t.column :postal_code, :string
-
-
t.timestamps
-
end
-
end
-
-
def self.down
-
drop_table :contacts
-
end
-
end
Теперь давайте создадим для поиска новый контроллер и представление:
Теперь, чтобы создать новое представление для контроллера поиска, давайте отредактируем файл search.rhtml, в котором и будет реализовано наше модное автозаполнение. Как видите, для этого много кода не потребуется:
-
<%= javascript_include_tag :defaults %>
-
<%= text_field_with_auto_complete :contact, :name %>
Первое, что бросается в глаза, — строка в самом начале кода c содержимым javascript_include_tag :defaults. Про эту строку нетрудно и забыть, а потом куда сложнее понять, что случилось. Этой строкой в код включаются файлы JavaScript, осуществляющие Rails-Ajax-волшебство. Без нее, в зависимости от типа используемого браузера, будет отображаться что-нибудь, начиная загадочными сообщениями об ошибке и заканчивая безжизненными формами HTML, без объяснения, что модная вставка отсутствует. Это может вызвать столь сильное раздражение, что я хочу обратить ваше внимание на следующий лозунг:
НЕ ЗАБЫВАЙТЕ ВКЛЮЧАТЬ В КОД ФАЙЛЫ JAVASCRIPT!
Теперь, когда магические заклинания включены в код, мы можем их вызвать:
-
<%= text_field_with_auto_complete :contact, :name %>
Это приведет к тому, что Rails создаст текстовое поле со всеми необходимыми JavaScript-прикреплениями. Так же, как и большинство других помощников Rails, метод text_field_with_auto_complete( ) не содержит ничего такого, что нельзя было бы сделать самостоятельно.
Но если вам когда-либо приходилось прикреплять JavaScript-обработку событий к HTML-элементам, вы поймете, какую реальную пользу приносят помощники.
Все, что клиент набирает, подключено к коду JavaScript, который наблюдает за текстовым полем и, по мере того как пользователь набирает текст в браузере, посылает запросы серверу. И еще один, завершающий, ингредиент — надо сообщить серверу, что следует делать при получении этих запросов. Привязка клиентских запросов к модели приложения весьма тривиальна. Она осуществляется двумя строками, включенными в SearchController:
-
class SearchController < ApplicationController
-
protect_from_forgery
nly => [:create, :delete, :update] -
auto_complete_for :contact, :name
-
-
…
Второй строкой Rails (первую я расписывал на этом топике) предписывается динамическая генерация метода действия под названием auto_complete_for_contact_name( ), который будет осуществлять поиск объектов, соответствующих введенному тексту, и отправлять результаты. В браузере эти результаты будут попадать в innerHTML, расположенный в <ам>-элементе DHTML-автозаполнения, создавая привлекательный всплывающий эффект.

Здравствуйте. Такой вопрос: есть множество скриптов добавления страницы в закладки, которые берут 2 параметра: url и title и подставляют их в ссылку, отправляющуюся, например, на memori.ru. То есть по нажатии кнопки мы попадаем на страницу memori с формой добавления, в которой url и title уже заполнены.
Возможно ли с помощью javascript заставить те же url и title точно так же по нажатию соответствующей кнопки автоматически вставляться в форму отправки email редактору сайта?
(email один и тот же, вставляется только url и title)
Конечно. Достаточно только передать и этот параметр.
Я имел в виду следующее: например, нужно передать эти параметры (url и title) в виде ссылки:
http://www.ezcontactr.com/write/b297d?subject=http://url.ру&message=крутая_ссылка
Как добиться, чтобы поля заполнялись по нажатию на такую ссылку?
Ну можно сделать, что б страница формировала на сервере с GET запроса тот же Javascript (или передать их в функцию) и запускала его на клиенте.