пользовательские проверки с действиями-как-тегируемыми-на

Привет, я работаю над проектом Rails 3, и я использую теги, и все работает отлично! :)

У меня только один вопрос.

Кто-нибудь знает, как я могу добавить свою «пользовательскую» проверку в ActsAsTaggableOn::Tag? Любые обратные вызовы, к которым я могу подключиться (например, before_tag_save)? или что-то подобное?

Мне нужно запустить регулярное выражение для каждого «тега» (чтобы убедиться, что каждый тег не содержит недопустимых символов) в моем списке тегов, прежде чем я сохраню свою модель, и хотел бы знать, есть ли стандартный способ сделать это.

Я решил проблему, добавив метод проверки в свой PostController, который просто перебирает список тегов и запускает регулярное выражение, но мне это кажется уродливым.

Какие-либо предложения?

Заранее спасибо! :)


person cgiacomi    schedule 28.10.2012    source источник


Ответы (3)


Раньше я использовал два способа. Один через пользовательский валидатор, другой с вызовом валидаторов.

Пользовательский метод проверки

В вашей модели настройте следующее

  validate :validate_tag

  def validate_tag
    tag_list.each do |tag|
      # This will only accept two character alphanumeric entry such as A1, B2, C3. The alpha character has to precede the numeric.
      errors.add(:tag_list, "Please enter the code in the right format") unless tag =~ /^[A-Z][0-9]$/
    end
  end

Очевидно, вам нужно будет заменить логику проверки и текст сообщения об ошибке чем-то более подходящим для ваших обстоятельств.

Имейте в виду, что в этом сценарии вы можете оценивать каждый тег как строку.

Стандартный метод проверки

Включите это в свою модель

validates :tag_list, :format => { :with => /^([A-Z][0-9],?\s?)*$/,
      :message => "Just too awesomezz" }

При использовании этого метода вам придется помнить, что вы проверяете весь массив, который выглядит как строка. По этой причине вам нужно будет разрешить запятые и пробелы между тегами.

Выбирайте тот способ, который вам больше всего подходит

person gk0r    schedule 05.11.2012

Вы можете сделать это в своей модели с помощью обратного вызова before_save. Там вы можете манипулировать (скажем) тегами сообщений до того, как они будут сохранены в базе данных.

person Agis    schedule 28.10.2012

Также вы можете переписать метод тега для модели пользователя:

  def tag(taggable, opts = {})
    return unless user.have? taggable.article
    super
  end

может быть полезно, если пользователь может пометить только одну и ту же статью (статья: has_many users)

person mpz    schedule 14.07.2015