如何阻止用户添加标签db中尚不存在的新标签?
我希望他们能够将已经存在的任何标签添加到他们可以完全编辑的另一个模型中,但如果它们还不存在则无法创建新标签吗?
我正在使用declarative_auth,因此应该创建一些具有权限的用户来添加他们想要的任何标签。
acts_as_tagger
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}" }
答案 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