Я использую виртуальные атрибуты для сохранения тегов в модели Entry из разделенного запятыми текстового поля в моей форме (на основе Railscasts # 167 ):
class Entry < ActiveRecord::Base
has_many :entry_tags
has_many :tags, :through => :entry_tags
after_save :update_tags
attr_writer :tag_names
def tag_names
tags.map(&:name).join(", ")
end
def update_tags
if @tag_names
self.tags = @tag_names.split(",").map do |name|
Tag.find_or_create_by_name(name.strip)
end
end
end
private :update_tags
end
Я хочу добавить проверку для своих имен тегов, но я не уверен, что лучший способ сделать это. У меня есть существующий метод проверки, определенный в модели тегов:
class Tag < ActiveRecord::Base
has_many :entry_tags
has_many :entries, :through => :entry_tags
validates_uniqueness_of :name
validates_format_of :name, :with => /\A[a-z0-9_ -]*\Z/, :on => :create
end
Однако, поскольку метод update_tags
вызывается после сохранения, любые ошибки проверки при создании будут возникать после того, как запись уже сохранена.
Я думаю о создании метода проверки в модели Entry и вызове его при сохранении записи, но:
- Если я сделаю это, я не уверен, каким будет лучший способ проверки. Должен ли я создать свою собственную проверку в
Entry
или создать объект Tag
для каждого имени и поставить галочку t.valid?
? Буду ли я каким-либо образом получать сообщения об ошибках валидации от Tag
или генерировать их?
- Я не уверен, что это даже правильный способ сделать такую проверку.
Есть предложения?