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であり、そのコレクション全体に特定の属性を割り当てようとしています。これはできません。特定のオブジェクトの属性に割り当てたい場合は、コレクションを反復処理するか、firstまたはlastまたはその他の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 に答える