Ваш метод 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
только один раз
создавать только таблицы, которые вы собираетесь визуализировать, вместо того, чтобы выполнять шаги по созданию таблиц, которые вы не собираетесь печатать в конце
Но, в конце концов, вы были в нескольких шагах от того, чтобы приведенные выше варианты использования работали так, как вы этого хотели.
Ruby on Rails имеет Опытную платформу в наличии. Эта платформа используется Script.aculo.us, и это обеспечивает управление autocompleter, которое может обеспечить функциональность, которую Вы ищете.
Направляющие делают, 'предлагают '-стиль автоматическое завершение на текстовых полях действительно легкое использование 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, ...)
. Если это не поведение, Вы хотите (например, если хотят ограничить поиск определенным подмножеством Post
s на основе зарегистрированного пользователя), затем необходимо определить собственное auto_complete_for_[object]_[method]
действие в Вашем контроллере.
Править: Я оставлю этот ответ здесь как своего рода теоретическую контрольную точку, но это кажется, что ответ autocompleter, вероятно, будет более полезен для Вас :)
Отказ от ответственности: Хотя я работаю на Google (который ясно имеет, "Предлагают" элементы в различном UIs), я не посмотрел ни на один код вокруг этой области, ни даже говорил с любым о клиентском аспекте.
Язык серверной стороны, вероятно, не важен здесь. Важным битом является Ajax, требуемый на стороне клиента.
Я предлагаю, чтобы у Вас был таймер приблизительно 1 секунды (эксперимент для нахождения зоны наилучшего восприятия), который сбрасывается каждый раз, когда пользователь вводит нажатие клавиши в текстовое поле и отмененный, если пользователь перешел далеко от текстового поля. Если таймер стреляет, заставьте его запустить запрос Ajax. Запрос Ajax содержал бы то, что пользователь ввел до сих пор. Ответ Ajax должен быть списком предложений и исходным текстом запроса.
Если, когда ответ Ajax возвращается, текст в текстовом поле является все еще тем же как полем в ответе (т.е. пользователь не ввел, с тех пор) и если текстовое поле все еще фокусируется, то предложите выпадающее. (Должны быть сотни страниц в качестве примера о полях комбинированного списка HTML, чтобы сделать эту сторону вещей.)
Весь сервер должен сделать, отвечают на запрос Ajax путем выполнения поиска и форматирования ответа соответственно - это намного легче, чем сторона клиента!
Надежда, которая помогает - извините, что не имела любой пример кода, но я подозреваю, что это вполне включено, и я не действительно разработчик JavaScript.
Как с большинством вещей в направляющих существует несколько способов сделать это. Направляющие раньше включали ряд встроенных помощников автозавершения, но та функциональность была теперь удалена к auto_complete плагину. Это вероятно самый легкий способ для Вас получить то, что Вы хотите реализованный - простая команда в контроллере, некоторый простой материал в Вашем представлении - ta-тире. Для использования этого решения, необходимо будет просто установить плагин в приложение - видят эту страницу, которая говорит Вам всем, что необходимо знать, чтобы установить его и начать.
Как отмечено в другом ответе, идя этим путем использует прототип и scriptaculous платформы Ajax, которые прибывают связанные направляющими. Существуют другие платформы Ajax, особенно JQuery, который может также помочь Вам выполнить эту функциональность, но у Вас будет больше наращивания, учащегося использовать их, чем просто движение с плагином.
Можно также попробовать это немного больше ручного подхода
# 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>