Реализация автозаполнения для нескольких полей в Rails - PullRequest
0 голосов
/ 23 марта 2011

У меня есть приложение, которое реализует групповую функцию. У каждой группы есть n участников. Кроме того, каждая группа имеет свой профиль для конкретной фотографии.

Мне удалось реализовать автозаполнение для функции группы, имея в виду только название группы. Я ссылался на следующий учебник для того же: - http://railsforum.com/viewtopic.php?id=23188

Я использую ruby ​​1.8.7 и rails 2.0.2 для конкретных целей проекта. Я установил плагин auto_complete в соответствующую директорию. Я на Ubuntu 10.04 ОС

Я хотел бы объединить еще две вещи как часть текущей функции автозаполнения для групп

1> Когда я набираю имя группы в текстовом поле для автозаполнения, я также могу видеть соответствующее изображение профиля конкретной группы, которое отображается на основе введенного текста.

2> Я также должен иметь возможность видеть количество отображаемых членов, соответствующих каждой группе, на основе введенного текста в текстовом поле автозаполнения.

Я сталкиваюсь со следующими препятствиями, идущими примерно одинаково:

В настоящее время код, который я реализовал для получения базовых автоматических завершенных работ на основе имени группы, выглядит следующим образом: -

in groups_controller.rb

auto_complete_for :investor_group, :title

in index.html.erb из групп

<%=stylesheet_link_tag "groups"%>
<%= javascript_include_tag :defaults %>

Search for a investor group: <%= text_field_with_auto_complete :investor_group, :title,  {}, {:method => :get} %><%=submit_tag "Search"%>

in config/routes.rb

map.resources :investor_group, :collection => {:auto_complete_for_investor_groups_title => :get }

В настоящее время я могу отобразить изображение для определенной группы и получить общее количество членов, принадлежащих группе, используя следующий код в index.html.erb групп: -

<%for inv_group in @investor_groups%>
<div class="inv_group_img" align="center"><%=image_tag "investor_groups/#{inv_group.title}.jpg"%></div>
  <div class="inv_group_details">
<%=inv_group.activated_members.size%><br>
<%end%>

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

У меня есть представление о том, что мне нужно делать, и я смог написать некоторый код для этого в моем groups_controller.rb

Чтобы получить то, что мне нужно, я попробовал следующее: -

def calculate_members_count
    @investor_group = InvestorGroup.find(params[:id])
    @members_count = @investor_group.activated_members.size
    return "@members_count", :title
  end

Теперь это должно дать мне название / название группы и members_count. Я не уверен, как я могу получить изображение в том же методе.

Кроме того, из этого Если это могло бы работать правильно, я вроде как сделал некоторую работу по предположению для изменений, которые будут отражены в уже написанной функциональности автозаполнения. Я не слишком уверен, что они были бы правильными ... но здесь это идет ..

Я изменил следующее в моем index.html.erb

Search for a investor group: <%= text_field_with_auto_complete :investor_group, :calculate_members_count,  {}, {:method => :get} %><%=submit_tag "Search"%>

Я изменил следующее в моем groups_controller.rb auto_complete_for: investor_group,: Calculate_members_count

Я действительно не уверен, что я до сих пор прав, если да, то я действительно не могу понять, какие изменения мне теперь нужно отразить в rout.rb

Я также хотел спросить, нужно ли мне вносить какие-либо изменения в мою модель случайно. Я так не думаю, но просто спросил на случай.

Также я предполагаю, что если текстовое поле автозаполнения поддерживает поиск по запросу только по одному атрибуту, то в этом случае мне нужно было бы определить настраиваемый поиск автозаполнения в соответствии с моими требованиями? Если да, я действительно понятия не имею, как начать, и как это сделать. Возможно, я только сейчас, что для этого также понадобился бы специальный javascript.

Пожалуйста, помогите мне в этом. Любые входы по этому вопросу были бы очень полезны ..

Спасибо за чтение и время для вашего пациента.


Question Edited


Я просто хотел сказать, что я новичок в Rails и у меня едва ли 2,5 месяца опыта.

После долгих поисков я понял, что для реализации функции автозаполнения для более чем одного поля мне нужно будет использовать настроенный метод автозаполнения.

Я обратился к следующему руководству, чтобы настроить настраиваемое автоматическое завершение работы для меня: - http://cobaltedge.com/auto-complete-text-fields-in-rails-2

Мой метод автоматического завершения выглядит следующим образом: -

 def auto_complete_for_investor_group_title
    re = Regexp.new("^#{params[:investor_group][:title]}", "i")

    #re1 = Regexp.new("^#{params[:investor_group][:title].jpg}", "i")

    find_options = { :order => "title ASC", :conditions => ['title LIKE ?', "%#{params[:title]}%"] }

   @investor_group = InvestorGroup.find(:all, find_options).collect(&:title).select { |title| title.match re }

render :inline => "<%= content_tag(:ul, @investor_group.map { |title| content_tag(:li, h(title)) }) %>"
  end

My index.html.erb для автоматической настройки настроенного метода выглядит следующим образом: -

<% form_tag ({: action =>: search}) do%> Поиск группы инвесторов: <% = text_field_with_auto_complete: investor_group,: title,: autocomplete => "off"%> <% = submit_tag "Поиск"%> <% end%>

Соответствующие изменения, внесенные в rout.rb , выглядят так: -

  map.auto_complete ':controller/:action', :requirements => { :action => /auto_complete_for_\S+/ }, :conditions => { :method => :get }

Этот код хорошо работает для извлечения группыназвание, когда оно ищется.Я хочу изменить этот код, чтобы он также получал изображение, специфичное для профиля группы, и общее количество членов, принадлежащих группе.

Загруженное изображение имеет тип file_field и имеет атрибут :uploaded_data.

Мне также нужно получить общее количество членов группы.В настоящее время изображение и общее количество членов, принадлежащих группе, отображается через index.html.erb отдельно, используя следующий код: -

 <%for inv_group in @investor_groups%>
        <div class="inv_group contentTableGray">
          <div class="inv_group_img" align="center"><%=image_tag "investor_groups/#{inv_group.title}.jpg"%></div>
          <div class="inv_group_details">
            <span style="float:right;padding-right: 10px;"><%=show_edit_link_for_group(inv_group)%></span>
            <%=link_to inv_group.title, :action => :show, :id => inv_group%>        
            <div style="clear:both;"></div>
            <%=truncate(inv_group.description,100)%>        
          </div>
          <div class="inv_group_details" style="width:14%;text-align: center;">
            <%=inv_group.activated_members.size%><br>

          ....( code continues further.. )

Я также выяснил, что размер группы может бытьчто-то вроде того, как его извлекли в groups_controller, используя такой код: -

 @investor_group = InvestorGroup.find(params[:id])
    @members = @investor_group.activated_members.size

Я действительно не уверен, как изменить этот код для метода auto_complete_for_investor_group_title.

активированные члены принимаются заассоциация из следующей модели investor_group.rb

has_many :activated_members, :through => :investor_group_members, :source => :investor, :conditions => "activated is true"

Используя приведенную выше информацию, я не могу понять, как я могу добавить общего числа участников, принадлежащих группе и профилю конкретной группы pic к уже существующей функции автозаполнения, которая работает для заголовка.

Можете ли вы помочь мне с тем же.

Большое спасибо.

1 Ответ

2 голосов
/ 01 апреля 2011

Итак, по частям:

  1. Когда вы получаете группы инвесторов, вы получаете только заголовки с призывом «собирать (&: заголовок)».Удалите его, чтобы получить весь объект;
  2. Вам не нужно использовать регулярное выражение, вы уже получаете заголовки, которые соответствуют условиям LIKE;
  3. Вместо встроенного рендера, попробуйте сделатьчастичное, которое отображает все, что вам нужно внутри тега LI.Рендеринг inline и content_tag хороши, когда все, что вам нужно, это небольшой текст, но с "большими вещами", предпочитайте партиалы.

Извините, что говорите.

Сборник (&: title) гласит: «Из всех найденных вами групп investor_, дайте мне только их названия».Итак, удалите его полностью, используя только:

InvestorGroup.find(:all, find_options)

Там написано «дай мне найденные вами группы инвестора», так что у вас будет массив групп инвестора для использования в частичном.При этом вы можете отобразить нужные данные в списке автозаполнения, как вы это сделали в index.html, с помощью оператора «for», поместив в элементы «li» изображения, заголовок и размер активированных членов.

Извините за любой английский.

Повторное обновление

Почти на месте.Чтобы автозаполнение работало, ответ от метода автозаполнения должен быть списком.Таким образом, частичное будет выглядеть так:

<ul>
  <% for inv_group in @investor_group2 %>
    <li><%=h inv_group.title %>, <%=h inv_group.activated_members.size %></li>
  <%end%>
</ul>

Каждый элемент, обернутый тегом li, и весь элемент, обернутый тегом ul.Если вы посмотрите предыдущий код, это именно то, как он работает:

content_tag(:ul, @investor_group2.map { |title| content_tag(:li, h(title)) })

тег содержимого ul, упаковывающий теги содержимого li, заключающие заголовки.

И я отделил заголовок иразмер в два эрба, потому что я никогда не пытался поместить две информации в одно и то же, и не теперь, если это работает.

Извините, что-нибудь на английском

...