【问题标题】:ActsAsTaggableOn + jQueryTokenField + Rails 4ActsAsTaggableOn + jQueryTokenField + Rails 4
【发布时间】:2015-02-19 10:05:02
【问题描述】:

我尝试按照本文中使用的示例: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: 标签列表令牌

我的第一个问题: 如果我单击编辑页面链接,则不会加载令牌字段并显示常规文本字段。如果我刷新编辑页面,则会出现令牌字段。

第二期: 自动完成功能正常工作,标签已创建,但令牌字段未预填充。

【问题讨论】:

  • 您能否发布表单的 HTML 输出示例?或者至少是#case_law_tag_list_tokens 元素?
  • @Clayton 是否应该在输入标签中生成 data-load 属性?
  • 简单的小调整:如果您不指定 prePopulate 选项,jquery.tokeninput 将默认查找 data-pre
  • 我对 Coffeescript 或 rails 资产管道的了解不够,无法诊断此问题,但我知道在我的应用程序中,我只是在&lt;model&gt;.js 中调用了.tokenInput(),它工作正常。我的预感是您的.js.coffee 文件没有被预编译或没有包含在页面加载中。如果您将该代码移到视图中的 &lt;script&gt;&lt;/script&gt; 元素中会发生什么?
  • @daveomcd 我有一个 attr_reader 和 def tag_list_tokens=(tokens) self.tag_list = tokens.gsub("'","") end

标签: ruby-on-rails-4 acts-as-taggable-on jquery-tokeninput


【解决方案1】:

我意识到我应该使用文本字段: &lt;%= f.text_field :tag_list_tokens, data: {load: @case_law_tags} %&gt; 而不是 simple_form 助手 &lt;%= f.input :tag_list_tokens, data: {load @case_law_tags} %&gt;

重新加载的问题与涡轮链接有关。跟随链接时,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()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-25
    • 2014-04-27
    相关资源
    最近更新 更多