Короче говоря, в вашем классе отсутствует сеттер (или в Ruby lingo, создателе атрибутов). Существует два способа определения сеттера и обработки преобразования строки разделенных пробелами имен тегов в объекты тегов и их сохранения в базе данных.
Раствор 1 (раствор Райана)
В вашем классе определите свой установщик, используя метод attr_writer
Ruby, и преобразуйте строку имен тегов (например, "tag1 tag2 tag3"
) в объекты Tag и сохраните их в базе данных в обратном вызове после сохранения. Вам также понадобится метод получения, который преобразует массив объекта Tag
для статьи в строковое представление, в котором теги разделены пробелами:
class Article << ActiveRecord::Base
# here we are delcaring the setter
attr_writer :tag_names
# here we are asking rails to run the assign_tags method after
# we save the Article
after_save :assign_tags
def tag_names
@tag_names || tags.map(&:name).join(' ')
end
private
def assign_tags
if @tag_names
self.tags = @tag_names.split(/\s+/).map do |name|
Tag.find_or_create_by_name(name)
end
end
end
end
Решение 2. Преобразование строки имен тегов в Tag
объекты в установщике
class Article << ActiveRecord::Base
# notice that we are no longer using the after save callback
# instead, using :autosave => true, we are asking Rails to save
# the tags for this article when we save the article
has_many :tags, :through => :taggings, :autosave => true
# notice that we are no longer using attr_writer
# and instead we are providing our own setter
def tag_names=(names)
self.tags.clear
names.split(/\s+/).each do |name|
self.tags.build(:name => name)
end
end
def tag_names
tags.map(&:name).join(' ')
end
end