使用正则表达式在Rails中实现以逗号分隔的自动完成标签。

7

我正在使用旧的auto_complete插件acts as taggable on宝石来尝试基本复制Stack Overflow本身的标记行为! 我大致上正在做这个rails cast中描述的内容。 对于单个标签,这很有效。 但是,我真的想让每次用户输入空格或逗号(就像在Stack Overflow上一样),自动完成都会重新开始。 我想有一些方法可以通过正则表达式来实现这一点,但我不确定如何在text_field中应用此行为(我想使用JavaScript “重新启动”自动完成,但是承认我在JavaScript方面相对较弱)。 这是我的视图:

<%= text_field_with_auto_complete :business, :tags, {}, { :url => formatted_businesses_path(:js), :method => :get, :with => "'search=' + element.value" } %>

我的控制器非常简单,只是保存特定业务的标签。

如果有人能指导我正确的方向(因为我不确定如何做到这一点),我将非常感激。


你有找到解决方案吗?我需要做完全相同的事情。 - ardavis
@ardavis:即使对你来说有点晚了,也可以看看选项 :tokens => [",", " "]control.js 使用它提供了“分词增量自动完成”。 - evnu
2个回答

10

虽然这可能有点老了,但我用rails3-jquery-autocompleteacts-as-taggable-on来重新创建这个行为。它们很好地协同工作并且易于使用。

// Model
class Foo < ActiveRecord::Base
  acts_as_taggable_on :tags
end

// Controller
class FoosController < ApplicationController
  autocomplete :tag, :name, :class_name => 'ActsAsTaggableOn::Tag'
  ...
end

// Routes
resources :foos do
  collection do
    get :autocomplete_tag_name
  end
end

//View
<% form_for :foo do |form| %>
  <%= form.label :tag_list, "Tags" %>
  <%= form.autocomplete_field :tag_list, autocomplete_tag_name_foos_path, :"data-delimiter" => ', ' %>
<% end %>

希望能对某些人有所帮助。


你的路径中的“notes”来自哪里?应该是“foos”,对吧?为了澄清,你可能需要更改它。 - Tim Baas
谢谢你的好回答。我成功地显示了自动完成标签,但是当我点击提交按钮时,无论是创建新的还是编辑,它都没有做任何事情。而且按钮似乎变成了禁用样式。在日志中,只显示了从GET自动完成的最后状态。 - Rizqi N. Assyaufi

1

我建议您看看 text_field_with_auto_complete 辅助程序的选项。如果它不支持您需要的功能,那么您可以放弃它,改用您更有控制权的东西。我的经验是,像这样的助手/插件只有在您做他们期望您做的事情时才能节省您时间。如果您需要任何自定义内容,则会遇到更多麻烦,尝试规避它们比值得它们。

要放弃 text_field_with_auto_complete 助手,请查看呈现页面中它生成的 HTML 和 JS。复制并粘贴它,然后修改以满足您的需求。您仍然可以使用自动完成插件的控制器侧。

您将想要将字符串拆分为逗号的 JS 将类似于此:

var tags = $('#myTextInput').value();
var splitTags = tags.split(/\w*,\w*/);

JS的正则表达式与Ruby的非常相似。该正则表达式将在逗号处分割,同时忽略额外的空格。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接