ActsAsTaggableOn + jQueryTokenField + Rails 4

Я попытался следовать примеру, использованному в этой статье: http://bloginius.com/blog/2013/12/31/how-integrate-acts-as-taggable-on-with-jquery-token-input-with-rails-3/ и применил его к моему сценарию, но в Rails 4.2. следующим образом:

<%= simple_form_for([:admin, @case_law]) do |f| %>
  <%= f.error_notification %>

  <div class="form-inputs">
    <%= f.input :title %>
    <%= f.input :citations %>
    <%= f.input :case_number %> 
    <%= f.input :facts, input_html: {rows: 15} %>
    <%= f.input :holding, input_html: {rows: 15} %>
    <%= f.input :jurisdiction, as: :country, priority: countries %>
    <%= f.input :court, collection: court_listings %>
    <%= f.input :judgment_date, as: :date_picker %>
    <%= f.input :tag_list_tokens, data: {load: @case_law_tags} %>

  </div>

  <div class="form-actions">
    <%= f.button :submit %>
  </div>
<% end %>

case_laws.js.coffee

jQuery ->
    $('#case_law_tag_list_tokens').tokenInput '/admin/case_laws/tags.json',
        theme: 'facebook'
        minChars: 2
        allowCustomEntry: true
        preventDuplicates: true
        prePopulate: $('#case_law_tag_list_tokens').data('load')

lib/extensions/tag_extend.rb

 module TagExtend
   extend ActiveSupport::Concern

    included do
        scope :by_tag_name, -> name { where("name like ?", "%#{name}%") }

        def self.token_input_tags
          where(nil).map{ |t| {id: t.name, name: t.name} }
         end
       end
     end

/initializers/acts_as_taggable_on.rb

ActsAsTaggableOn::Tag.send(:include, Intejus::TagExtend)

controllers/admin/case_laws_controller.rb

class Admin::CaseLawsController < AdminController
  before_action :find_tags, only: [:new, :create, :edit, :update]
  ....
    def tags
      tags = ActsAsTaggableOn::Tag.by_tag_name(params[:q]).token_input_tags
      respond_to do |format|
       format.json { render json: tags }
      end
    end
  private
   def find_tags
      @case_law_tags = params[:id].present? ?    CaseLaw.find(params[:id]).tags.token_input_tags : []
   end

Вот сгенерированный HTML: ‹\div class="form-group string optional case_law_tag_list_tokens">‹\label class="string optional control-label" for="case_law_tag_list_tokens">токены списка тегов‹\ul class="token-input -list-facebook">‹\li class="token-input-input-token-facebook">‹\input type="text" autocomplete="off" autocapitalize="off" id="token-input-case_law_tag_list_tokens" style="outline: none; width: 209.993048667908px;">‹\tester style="position: absolute; top: -9999px; left: -9999px; width: auto; размер шрифта: 11.9999990463257px; семейство шрифтов: Verdana , без засечек; вес шрифта: 400; межбуквенный интервал: 0px; пробел: nowrap;">‹\input class="string optional form-control" type="text" name="case_law [tag_list_tokens]" id="case_law_tag_list_tokens" style="display: none;">

Моя первая проблема: если я нажму ссылку на страницу редактирования, поле токена не загрузится, и отобразится обычное текстовое поле. Если я обновлю страницу редактирования, появится поле токена.

Вторая проблема: автозаполнение работает, и теги создаются, но поле токена не заполняется заранее.


person DaneEH    schedule 19.02.2015    source источник
comment
Можете ли вы опубликовать образец вывода HTML для формы? Или хотя бы элемент #case_law_tag_list_tokens?   -  person Clayton    schedule 01.03.2015
comment
@Clayton следует ли генерировать атрибут загрузки данных во входном теге?   -  person DaneEH    schedule 02.03.2015
comment
Незначительное упрощение: если вы не укажете параметр prePopulate, jquery.tokeninput по умолчанию будет искать data-pre.   -  person Clayton    schedule 02.03.2015
comment
Я недостаточно знаю о Coffeescript или конвейере ресурсов rails, чтобы диагностировать это, но я знаю, что в своем приложении я просто поместил вызов .tokenInput() в <model>.js, и он работает нормально. Я предполагаю, что ваш файл .js.coffee не подвергается предварительной компиляции или не включается в загрузку страницы. Что произойдет, если вы переместите этот код в элемент <script></script> в своем представлении?   -  person Clayton    schedule 02.03.2015
comment
Я смог изменить его, изменив время запуска функции, изменив мой ответ, чтобы показать. Спасибо хоть.   -  person DaneEH    schedule 02.03.2015
comment
@DaneEH, как выглядит ваш метод tag_list_tokens в файле вашей модели? Спасибо!   -  person daveomcd    schedule 04.01.2016
comment
@daveomcd у меня есть attr_reader с def tag_list_tokens=(токены) self.tag_list = tokens.gsub(',) end   -  person DaneEH    schedule 06.01.2016


Ответы (1)


Я понял, что должен был использовать текстовое поле: <%= f.text_field :tag_list_tokens, data: {load: @case_law_tags} %> вместо хелпера simple_form <%= f.input :tag_list_tokens, data: {load @case_law_tags} %>

Проблема перезагрузки была связана с турболинками. Rails не выполняет полную перезагрузку документа при переходе по ссылке. Он загружает различия между страницами через ajax. Я исправил проблему, изменив свой код как:

case_laws.js.coffee

tokenizeCaseLawTags = ->
  $('#case_law_tag_list_tokens').tokenInput '/admin/case_laws/tags.json',
    theme: 'facebook'
    minChars: 2
    allowCustomEntry: true
    preventDuplicates: true
    prePopulate: $('#case_law_tag_list_tokens').data('load')

$(document).on "ready page:load", ->
  tokenizeCaseLawTags()
person DaneEH    schedule 02.03.2015