acts_as_taggable_on具有创建新标记所需的权限

时间:2011-02-16 14:37:15

标签: ruby-on-rails ruby-on-rails-3 tags acts-as-taggable-on

如何阻止用户添加标签db中尚不存在的新标签?

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

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

user.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}" }

3 个答案:

答案 0 :(得分:2)

我没有使用过act_as_taggable,但你可以通过正常的rails验证吗?

# LIKE is used for cross-database case-insensitivity
validates_inclusion_of :name => lambda { find(:all, :conditions => ["name LIKE ?", name]) }

答案 1 :(得分: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

答案 2 :(得分:1)

这是一种有效且干净的方式来强制执行允许的标记:

validate :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
  if invalid_tags.any?
    errors.add(:tag_list, "contains unknown tags: [#{invalid_tags.join(', ')}]")
  end
end