“предложите” функцию текстовых полей в приложении для направляющих

Ваш метод generate_table всегда печатает две таблицы, когда вы хотите, чтобы он распечатал только одну:

Ваша исходная функция:

def generate_table(inventory):
    args = arguments()
    ... 

    print(main_table_header)
    print(lldp_table_header)

Должна просто измениться на: [ 118]

def generate_table(inventory):
    args = arguments()
    ... 

    if args.lldp:
        print(lldp_table_header)
    else:
        print(main_table_header)

Другие комментаторы упомянули оптимизации, которые, как правило, улучшают код, который вы должны рассмотреть, например:

  • , генерируя arguments только один раз

    [ 114]
  • создавать только таблицы, которые вы собираетесь визуализировать, вместо того, чтобы выполнять шаги по созданию таблиц, которые вы не собираетесь печатать в конце

Но, в конце концов, вы были в нескольких шагах от того, чтобы приведенные выше варианты использования работали так, как вы этого хотели.

9
задан BalusC 14 October 2011 в 05:18
поделиться

5 ответов

Ruby on Rails имеет Опытную платформу в наличии. Эта платформа используется Script.aculo.us, и это обеспечивает управление autocompleter, которое может обеспечить функциональность, которую Вы ищете.

5
ответ дан 4 December 2019 в 13:06
поделиться

Направляющие делают, 'предлагают '-стиль автоматическое завершение на текстовых полях действительно легкое использование text_field_with_auto_complete метод.

В направляющих 1.x этот метод был создан в ActionView::Helpers::JavaScriptMacrosHelper, но для направляющих 2.x это было перемещено в отдельный плагин.

Скажем, Вам назвали модель Post которому назвали текстовое поле title. В Вашем представлении, где Вы обычно использовали бы text_field_tag (или f.text_field), просто используйте text_field_with_auto_complete вместо этого:

<%= text_field_with_auto_complete :post, :title %>

Кроме того, в PostsController, необходимо сделать соответствующее объявление:

class PostsController < ApplicationController
  auto_complete_for :post, :title
end

Что это делает негласно, динамично добавляют названное действие auto_complete_for_[object]_[method] к контроллеру. В вышеупомянутом примере назовут это действие auto_complete_for_post_title.

Стоит указать что find вызов, используемый этим автоматически сгенерированным действием, будет действовать через все объекты модели, например. Post.find(:all, ...). Если это не поведение, Вы хотите (например, если хотят ограничить поиск определенным подмножеством Posts на основе зарегистрированного пользователя), затем необходимо определить собственное auto_complete_for_[object]_[method] действие в Вашем контроллере.

8
ответ дан 4 December 2019 в 13:06
поделиться

Править: Я оставлю этот ответ здесь как своего рода теоретическую контрольную точку, но это кажется, что ответ autocompleter, вероятно, будет более полезен для Вас :)

Отказ от ответственности: Хотя я работаю на Google (который ясно имеет, "Предлагают" элементы в различном UIs), я не посмотрел ни на один код вокруг этой области, ни даже говорил с любым о клиентском аспекте.

Язык серверной стороны, вероятно, не важен здесь. Важным битом является Ajax, требуемый на стороне клиента.

Я предлагаю, чтобы у Вас был таймер приблизительно 1 секунды (эксперимент для нахождения зоны наилучшего восприятия), который сбрасывается каждый раз, когда пользователь вводит нажатие клавиши в текстовое поле и отмененный, если пользователь перешел далеко от текстового поля. Если таймер стреляет, заставьте его запустить запрос Ajax. Запрос Ajax содержал бы то, что пользователь ввел до сих пор. Ответ Ajax должен быть списком предложений и исходным текстом запроса.

Если, когда ответ Ajax возвращается, текст в текстовом поле является все еще тем же как полем в ответе (т.е. пользователь не ввел, с тех пор) и если текстовое поле все еще фокусируется, то предложите выпадающее. (Должны быть сотни страниц в качестве примера о полях комбинированного списка HTML, чтобы сделать эту сторону вещей.)

Весь сервер должен сделать, отвечают на запрос Ajax путем выполнения поиска и форматирования ответа соответственно - это намного легче, чем сторона клиента!

Надежда, которая помогает - извините, что не имела любой пример кода, но я подозреваю, что это вполне включено, и я не действительно разработчик JavaScript.

1
ответ дан 4 December 2019 в 13:06
поделиться

Как с большинством вещей в направляющих существует несколько способов сделать это. Направляющие раньше включали ряд встроенных помощников автозавершения, но та функциональность была теперь удалена к auto_complete плагину. Это вероятно самый легкий способ для Вас получить то, что Вы хотите реализованный - простая команда в контроллере, некоторый простой материал в Вашем представлении - ta-тире. Для использования этого решения, необходимо будет просто установить плагин в приложение - видят эту страницу, которая говорит Вам всем, что необходимо знать, чтобы установить его и начать.

Как отмечено в другом ответе, идя этим путем использует прототип и scriptaculous платформы Ajax, которые прибывают связанные направляющими. Существуют другие платформы Ajax, особенно JQuery, который может также помочь Вам выполнить эту функциональность, но у Вас будет больше наращивания, учащегося использовать их, чем просто движение с плагином.

1
ответ дан 4 December 2019 в 13:06
поделиться

Можно также попробовать это немного больше ручного подхода

# your_view.rhtml

<%= text_field 'contact', 'name', :id => 'suggest' %>
<div id='dropdown' style='display:none; z-index: 100; background: #FFFFFF'></div>

<script>
  new Ajax.Autocompleter('suggest', 'dropdown', "<%= url_for :controller => 'contacts', :action => 'suggest_name' %>") 
</script>

# contacts_controller.rb

def suggest_name
  query_string = params[:contact][:name]
  @contacts = Contact.find.all :conditions => ['name ilike ?', "%#{query_string}%"]
  render :partial => 'name_suggestions'
end

# contacts/_name_suggestions.rhtml

<ul>
<% for contact in @contacts %>
  <li><%= contact.name %></li>
<% end %>
</ul>
1
ответ дан 4 December 2019 в 13:06
поделиться
Другие вопросы по тегам:

Похожие вопросы: