acts_as_taggable_on с разрешениями, необходимыми для создания новых тегов - PullRequest
2 голосов
/ 16 февраля 2011

Как я могу запретить пользователям добавлять новые теги, которых еще нет в тегах 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 ]

2 голосов
/ 22 февраля 2011

Возможно, это будет более надежно и похоже на валидацию, но это работает:

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 голосов
/ 16 февраля 2011

Я не использовал act_as_taggable, но вы можете пройти обычные проверки рельсов?

# LIKE is used for cross-database case-insensitivity
validates_inclusion_of :name => lambda { find(:all, :conditions => ["name LIKE ?", name]) }
1 голос
/ 20 февраля 2013

Вот эффективный и чистый способ применения разрешенных тегов:

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
...