开发者

acts_as_taggable_on with permissions required to create new tags

开发者 https://www.devze.com 2023-02-11 01:31 出处:网络
How can I prevent users from adding new tags which don\'t already exist in the tags db? I want them to be able to add any tags that already exist to another model which they can fully edit, but not b

How can I prevent users from adding new tags which don't already exist in the tags db?

I want them to be able to add any tags that already exist to another model which they can fully edit, but not be able to create new tags if they don't yet exist?

I'm using declarative_auth so some users with permissions should be create to add whatever tags they want.

user.rb

acts_as_tagger

post.rb

acts_as_taggable_on :features

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

UPDATE:

This seems to do it except I can't get the error message variable开发者_如何学编程 to work:

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


I havn't used acts_as_taggable, but can you pass normal rails validations?

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


Could probably be more robust and rails validation like but this works:

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


Here's an efficient and clean way to enforce allowed tags:

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
0

精彩评论

暂无评论...
验证码 换一张
取 消