Приложение Rails имеет проблемы с сохранением между моделями

Я работаю над приложением, которое загружает мета-теги с веб-сайтов и затем сохраняет их. Загрузка происходит в модели под названиемSite, Я хотел бы сохранить загруженные метатеги роботов в модель под названиемrobots_tag который подключен к сайтам через таблицу соединенийmeta_tag_sites.

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

undefined method `robots_meta=' for []:ActiveRecord::Relation

Есть идеи, что я делаю не так?

class Site < ActiveRecord::Base
  attr_accessible :domain 
  belongs_to :user
  has_many :meta_tag_sites
  has_many :robots_tags, through: :meta_tag_sites
  accepts_nested_attributes_for :robots_tags

  # ...

  def download_robots_meta_tags
    robots_tags = Nokogiri::HTML(Net::HTTP.get(self.domain, "/")).xpath("//meta[@name='robots']")
    robots_tags.each do |tag|
      self.robots_tags.robots_meta = tag
    end
  end

  # ...

end

class RobotsTag < ActiveRecord::Base
  attr_accessible :robots_meta
  has_many :meta_tag_sites
  has_many :sites, through: :meta_tag_sites
end

class MetaTagSite < ActiveRecord::Base
  attr_accessible :site_id, :meta_tag_id
  belongs_to :site
  belongs_to :robots_tag
end

(Кстати, этот пост связан с более ранним постом:Web-приложение Rails становится слишком модельным?).

 David J.22 июн. 2012 г., 17:26
У вас есть некоторые синтаксические ошибки выше. Например:attr_accessible :domain, не должно заканчиваться запятой. Кроме того, в целях стиля,# ... выглядит намного лучше, чем равнина....

Ответы на вопрос(2)

Решение Вопроса

Проблема здесь:

self.robots_tags.robots_meta = tag

self.robots_tags этоcollection объектов, определенныхhas_many :robots_tagsи вы пытаетесь назначить определенный атрибут для всей этой коллекции. Вы не можете сделать это. Если вы хотите присвоить атрибуту определенного объекта, вы должны либо выполнить итерацию по коллекции, либо выбрать конкретный объект из коллекции с помощьюfirst или жеlast или любой другойEnumerable методы.

self.robots_tags.robots_meta = tag

Вы должны перебратьself.robots_tags вместо этого, с чем-то вроде:

self.robots_tags.each do |robot_tag|
  robot_tag.robots_meta = tag
end

Ваш ответ на вопрос