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}" } %>
Я надеюсь, что это поможет любому, кто может столкнуться с той же проблемой.