0

問題は、次のエラーが発生することです。

ActiveModel::MassAssignmentSecurity::Error: Can't mass-assign protected attributes: amenity_id

このコードを実行すると:

task import_amenities: :environment do

  agent = Mechanize.new

  Kindergarten.find_all_by_public(false).each do |k| 
    p = agent.get(k.uri)
    amenities = p.search("td td tr:nth-child(11) td:nth-child(2)").text.split(/(;|,) */)
    amenities.each do |a|
      am = Amenity.find_or_create_by_name!("#{a}")
      k.update_attributes(amenity_id: am.id)
    end
  end
end

幼稚園とアメニティは HABTM 関係によってリンクされており、以下のように定義されています。

幼稚園.rb

class Kindergarten < ActiveRecord::Base
  attr_accessible :location, :name, :public, :uri, :address, :contact, 
                  :phone, :url, :email, :description, 
                  :password, :password_confirmation, :amenity_ids
  has_and_belongs_to_many :amenities
end

amenity.rb

class Amenity < ActiveRecord::Base
  attr_accessible :name, :kindergarten_ids
  has_and_belongs_to_many :kindergartens
end

結合テーブルの移行は次のとおりです。

class CreateKindergartensAmenitiesJoinTable < ActiveRecord::Migration
  def up

    create_table :kindergartens_amenities, :id => false do |t|
      t.integer :kindergarten_id
      t.integer :amenity_id
    end
  end
end

このエラーは、rake タスクの次の行によって発生します。

k.update_attributes(amenity_id: am.id)

大量の割り当てに到達するまで、コンソールではすべてがうまく機能しているようです。そして、HABTM を使用したことがないので、ここで本当に何かを台無しにしていると思います。

何かご意見は?

4

1 に答える 1

1

このバグのために昨夜は眠れませんでしたが、ようやく解決策を見つけました。

コードにはいくつかの問題があり、データベースにデータを手動で掘り下げて追加し始めたときに最初に気付いたのは、結合テーブルの名前が間違っていることです。そのための修正:

class RenameKindergartensAmenitiesTable < ActiveRecord::Migration
  def up
    rename_table :kindergartens_amenities, :amenities_kindergartens
  end
end

どうやらhabtm協会は、タイトルにアルファベット順に並べる必要があります。ソース

2番目の問題は私が

k.amenity_id = am.id

既存のアメニティごとにamenity_id/kindergarten_idを追加します。実際、k.amenity_idは何も意味しません(特に多くのIDの場合)。うまくいった解決策はこれです:

amenities.each do |a|
  am = Amenity.find_or_create_by_name!("#{a}")
  k.update_attributes(amenity_ids: k.amenity_ids.push(am.id))
end

attr_accessible私はどこも変更していません

于 2012-09-17T06:51:32.757 に答える