2016-10-07 4 views
1

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

form.html.slim

.form-group.text-center 
     = f.label :tag_ids, "Tags" 
     = f.collection_select :tag_ids, Tag.order(:name), :id, :name, {}, {multiple: true} 

enter image description here

Мне нужно, чтобы добавить новый тег, если он не существует.

+0

Вы либо сделали бы это через вызов ajax, либо с помощью [вложенных атрибутов] (http://api.rubyonrails.org/classes/ActiveRecord/NestedAttributes/ClassMethods.html). Однако вы должны показать, что вы хотя бы попытались решить проблему или задумались о решении, или этот вопрос, скорее всего, будет закрыт. – max

+0

Я только что сделал это несколько дней назад с act_as_taggable и selectize.js. Если вы хотите, чтобы решение, использующее это, дайте мне знать. – bkunzi01

+0

@ bkunzi01 Будет здорово знать, как вы его реализовали. – maheshkumar

ответ

2

Ok с Selectize.js, Acts_as_Taggable, & SimpleForm:

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

<%= f.input :nationalities, as: :string, placeholder: "Nationalities", input_html: { id: 'nationality-input'} %> 

Затем инициализировать selectize.js:

#The following line gets all tags ever posted for a user with the context 'nationalities' which we will use as options. 
<%=nations = ActsAsTaggleOn::Tagging.includes(:tag).where(context: 'nationalities').uniq.pluck(:id, :name) 
$(document).ready(function() { 
$('#nationality-input).selectize({ 
    delimiter: ',', 
    persist: true, 
    allowEmptyOption: false, 
    options: [ 
     <% nations.each do |nat| %> 
     {text: '<%=nat[1] %>', value: '<%=nat[1]%>' }, 
     <% end %> 
    searchField: 'text', 
    create: function(input) { 
     return { 
      value: input, 
      text: input 
    } 
    } 
}); 
}); 

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