Ruby on rails 使用创建新标记所需的权限作为标记
如何防止用户添加标签数据库中不存在的新标签 我希望他们能够将任何已经存在的标签添加到另一个模型中,他们可以完全编辑该模型,但如果它们还不存在,就不能创建新的标签 我使用的是声明性的_auth,因此应该创建一些具有权限的用户来添加他们想要的任何标记 user.rb post.rb 更新: 这似乎可以做到,但我无法让错误消息变量工作:Ruby on rails 使用创建新标记所需的权限作为标记,ruby-on-rails,ruby-on-rails-3,tags,acts-as-taggable-on,Ruby On Rails,Ruby On Rails 3,Tags,Acts As Taggable On,如何防止用户添加标签数据库中不存在的新标签 我希望他们能够将任何已经存在的标签添加到另一个模型中,他们可以完全编辑该模型,但如果它们还不存在,就不能创建新的标签 我使用的是声明性的_auth,因此应该创建一些具有权限的用户来添加他们想要的任何标记 user.rb post.rb 更新: 这似乎可以做到,但我无法让错误消息变量工作: validates :feature_list, :inclusion => { :in =>
validates :feature_list, :inclusion => {
:in => SomeModel.tag_counts_on(:features).map(&:name),
:message => "does not include {s}" }
我没有使用acts作为标记,但是你能通过正常的rails验证吗
# LIKE is used for cross-database case-insensitivity
validates_inclusion_of :name => lambda { find(:all, :conditions => ["name LIKE ?", name]) }
可能会更健壮,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
这里有一种高效、干净的方法来强制执行允许的标记: 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 验证:必须有有效的标记 def必须有有效的标签 valid_tags=actsastaggaleon::Tag.select('LOWER(name)name')。其中(name:Tag_list)。map(&:name) 无效的\u标记=标记\u列表-有效的\u标记 如果标签无效,是否有? errors.add(:tag_list,“包含未知标记:[#{invalid_tags.join(',')}])) 终止 终止
@霍尔顿,对不起,这是我无法理解的(
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
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