0

我正在开发一个从网站下载元标记并保存的应用程序。下载发生在一个名为Site. 我想将下载的机器人元标记保存到一个名为的模型中,该模型robots_tag通过一个名为meta_tag_sites.

但是我在站点模型中编写的用于执行此操作的方法不起作用。当我尝试在控制台中调用该方法时,出现以下错误。

[]:ActiveRecord::Relation 的未定义方法 `robots_meta='

知道我做错了什么吗?

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-scraping Rails App Getting Over-Modelled?)。

4

2 回答 2

3

问题在这里:

self.robots_tags.robots_meta = tag

self.robots_tags是由 定义的对象的集合has_many :robots_tags,并且您正在尝试将特定属性分配给整个集合。你不能这样做。如果要分配给特定对象的属性,则必须遍历集合,或者通过firstlast或任何其他Enumerable方法从集合中选择特定对象。

于 2012-06-22T15:26:59.720 回答
1

通过检查,违规行似乎是:

self.robots_tags.robots_meta = tag

您应该迭代self.robots_tags,例如:

self.robots_tags.each do |robot_tag|
  robot_tag.robots_meta = tag
end
于 2012-06-22T15:29:26.737 回答