2

如何防止用户添加标签数据库中尚不存在的新标签?

我希望他们能够将已经存在的任何标签添加到他们可以完全编辑的另一个模型中,但如果它们尚不存在则无法创建新标签?

我正在使用 declarative_auth 所以应该创建一些具有权限的用户来添加他们想要的任何标签。

用户.rb

acts_as_tagger

post.rb

acts_as_taggable_on :features

https://github.com/mbleigh/acts-as-taggable-on

更新:

这似乎可以做到,除了我无法让错误消息变量工作:

  validates :feature_list, :inclusion => { 
                           :in => SomeModel.tag_counts_on(:features).map(&:name), 
                           :message => "does not include {s}" }
4

3 回答 3

2

我没有使用acts_as_taggable,但你能通过正常的rails验证吗?

# LIKE is used for cross-database case-insensitivity
validates_inclusion_of :name => lambda { find(:all, :conditions => ["name LIKE ?", name]) }
于 2011-02-16T14:55:21.497 回答
2

可能会更健壮,并且像 rails 验证一样,但这有效:

validate :valid_feature_tag

  def valid_feature_tag
    invalid_tags = false
    feature_list.each do |tag|
      list = SomeModel.tag_counts_on(:features).map(&:name)
      unless list.include?(tag)
        invalid_tags = true  
      end
    end
    unless invalid_tags == false
      errors.add(:feature_list, 'cannot contain new tags, please suggest new tags to us')
      return false
    else
      return true
    end
  end
于 2011-02-22T15:52:37.620 回答
1

这是强制执行允许标签的一种有效且干净的方法:

验证:must_have_valid_tags

def must_have_valid_tags
  valid_tags = ActsAsTaggableOn::Tag.select('LOWER(name) name').where(name: tag_list).map(&:name)

  invalid_tags = tag_list - valid_tags
  如果 invalid_tags.any?
    errors.add(:tag_list, "包含未知标签:[#{invalid_tags.join(', ')}]")
  结尾
结尾
于 2013-02-19T23:04:39.170 回答