Rails JQuery автозаполнение и динамические вложенные поля

У меня есть приложение, в котором я использую драгоценные камни rails3-jquery-autocomplete а также nested_form предложить существующим пользователям помечать их как участников проекта.

Форма просмотра:

<%= f.fields_for :contributors do |contributor|%>
    <%= contributor.autocomplete_field :name, autocomplete_user_profile_last_name_projects_path, :update_elements => { :user_id => "#user_id" } %><br>
    <%= contributor.hidden_field :user_id %>
    <%= contributor.radio_button :contributor_type, 'Colleague' %> 
    <%= contributor.radio_button :contributor_type, 'Supervisor' %> 
    <%= contributor.radio_button :contributor_type, 'Client' %> 
    <%= contributor.link_to_remove "Remove this contributor" %>
<% end %>
<%= f.link_to_add "Add a contributor", :contributors %><br> 

Я также перезаписал get_autocomplete_function(parameters) функция для того, чтобы разрешить более одного столбца в моем автозаполнении, а именно столбцы first_name а также last_name

def get_autocomplete_items(parameters)
  items = UserProfile.select("DISTINCT CONCAT_WS(' ', first_name, last_name ) AS full_name, first_name, last_name, id, user_id").where(["CONCAT_WS(' ', first_name, last_name) LIKE ?", "%#{parameters[:term]}%"])
end

У меня также есть следующая строка в моем контроллере Projects:

autocomplete :user_profile, :last_name, :full => true, :extra_data => [:first_name, :last_name, :user_id ], :display_value => :fullname

С функцией `полное имя 'просто:

def fullname
    "#{first_name} #{last_name}"
end

Что я хочу сделать, это получить значение user_id из элементов автозаполнения и поместите его значение в скрытое поле, но когда я проверяю сервер, он выводит что-то вроде:

 Parameters: {"utf8"=>"✓", "authenticity_token"=>"DYQ7iJeqdwMQrprSGn0WNHXY5iXDZLA5pUd3OlYJ2so=", "project"=>{"creator"=>"1", "title"=>"lesdodis", "contributors_attributes"=>{"0"=>{"name"=>"Test User the 1st", "user_id"=>"", "contributor_type"=>"Client", "_destroy"=>"false", "id"=>"21"}, "1"=>{"name"=>"Test User the 2nd", "user_id"=>"", "contributor_type"=>"Supervisor", "_destroy"=>"false", "id"=>"22"}, "1393677266696"=>{"name"=>"", "user_id"=>"", "_destroy"=>"1"}, "1393677267518"=>{"name"=>"", "user_id"=>"", "_destroy"=>"1"}}, "description"=>"asdad", "tag_list"=>"sdads", "link"=>"asdasd", "gallery_attributes"=>{"screenshots_attributes"=>{"0"=>{"description"=>"", "_destroy"=>"false", "id"=>"10"}}, "id"=>"16"}}, "commit"=>"Update", "id"=>"16"}

где user_id поле внутри участников оставлено пустым. Я уже пытался вручную назначить идентификаторы для полей с помощью contributor.object.id присвоить уникальный номер имени поля с ограниченным успехом, так как новые динамически добавленные поля не имеют идентификаторов объектов. Я использую эту форму как для создания, так и для обновления записи проекта, поэтому я хотел бы попросить помощи в том, как заставить эту работу работать независимо от редактирования поля или добавления нового.

Обновление: через некоторое время поиска я наконец-то начал работать, добавив этот код

<% field_name = "#{contributor.object_name}[user_id]".gsub(/(\])?\[/, "_").chop %>
<%= contributor.autocomplete_field :name, autocomplete_user_profile_last_name_projects_path, :update_elements => { :user_id => "##{field_name}" } %><br>

Я надеюсь, что это поможет любому, кто может столкнуться с той же проблемой.

2 ответа

Я тоже боролся с подобной проблемой. В вашем случае, я чувствую, что помощники nested_form генерируют уникальные идентификаторы, которые побеждают селектор "#user_id", переданный: update_elements.

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

$(document).on('nested:fieldAdded', function(nf_event) {
  var ac_input = nf_event.field.find('.ui-autocomplete-input');
  ac_input.bind('railsAutocomplete.select', function(ac_event, data) {
    $(this).next('input[type=hidden]').val(data.item.id);
  });
});

Для ваших участников, созданных с помощью существующих ассоциаций (т. Е. Редактирования), вы можете привязать к их автозаполнению входные данные в $(document).ready(). Это может, по крайней мере, указать вам правильное направление.

Через некоторое время поиска я, наконец, получил его, добавив этот код

<% field_name = "#{contributor.object_name}[user_id]".gsub(/(\])?\[/, "_").chop %>
<%= contributor.autocomplete_field :name, autocomplete_user_profile_last_name_projects_path, :update_elements => { :user_id => "##{field_name}" } %>

Я надеюсь, что это поможет любому, кто может столкнуться с той же проблемой.

Другие вопросы по тегам