0

次のようにコードを更新しました。

class CreateAddresses < ActiveRecord::Migration
 def self.up
 create_table :addresses do |t|
  t.integer :address_type_id
  t.text :street
  t.string :city
  t.string :state, :limit => 2
  t.integer :zip
  t.references :entry

  t.timestamps
 end
  add_index :addresses, :entry_id
...

class CreateAddressTypes < ActiveRecord::Migration
  def self.up 
  create_table :address_types do |t|
  t.string :name
end

私のモデル:

class AddressType < ActiveRecord::Base 
 has_many :addresses 
 attr_accessible :name 
end

class Entry < ActiveRecord::Base
  has_many :addresses
  attr_accessible :email, :first_name, :last_name
end
class Address < ActiveRecord::Base
  belongs_to :entry
  belongs_to :address_type
  attr_accessible :city, :state, :street, :zip
end

そして私の_formファイル:

 ...
 .form-inputs
= f.collection_select (:address_type_id, AddressType.all, :id, :name)
= f.input :street
= f.input :city

「作成」を押した後、「保護された属性を一括割り当てできません: address_type_id」というエラーが表示されます。どこかで間違いを犯さなければならないことはわかっていますか?

4

1 に答える 1

0

オブジェクトの関係によると、次のようなことができます。

# in view (HAML)
%th Address Type
%td= address.address_type.name

おそらく (どのように動作させたいかによって)、Address に AddressType がリンクされていない場合があります。これをサポートして Nil 例外を防ぐには、次のようにします。

# in view (HAML)
%th Address Type
%td= address.address_type.try(:name)

メソッドのtry名前は明示的です。メソッド (ここではname) を AddressType オブジェクトに対して呼び出そうとします。これがメソッドに応答する場合、nilまたは応答しない場合は、Nil:NilClass の NoMethodError を発生させずに戻ります。namenil

あなたの関係は正しく設定されていません:

アドレスは、1 つの (最大) アドレス タイプのみを持つことができます。逆に、アドレス タイプはゼロ、1 つ、または複数のアドレスに設定できます。つまり、Rails (および共通言語であり、読みやすく理解しやすい) では次のようになります。

  • アドレスbelongs_toAddressType
  • AddressTypehas_manyアドレス

これらの関係は次のように設定できます: (関係のない他のステートメントを削除しました)

class Address < ActiveRecord::Base
   belongs_to :address_type
end

class AddressType < ActiveRecord::Base
    has_many :addresses # note: Rails need plural relations for has_many
end

これは、Address テーブルaddress_type_idに、特定の AddressType (Home、Work、またはその他) を参照するという名前の列があることを意味します。(AddressType の前の列を破棄し、Address テーブルに追加するために、移行を実行する必要がある場合があります)。

編集

コードを次のように更新しました。

class CreateAddresses < ActiveRecord::Migration
   def self.up
     create_table :addresses do |t|
      t.integer :address_type_id
      t.text :street
      t.string :city
      t.string :state, :limit => 2
      t.integer :zip
      t.references :entry

      t.timestamps
    end
     add_index :addresses, :entry_id
 ...

 class CreateAddressTypes < ActiveRecord::Migration
  def self.up 
    create_table :address_types do |t|
    t.string :name
  end

私のモデル: class AddressType < ActiveRecord::Base has_many :addresses attr_accessible :name end

class Entry < ActiveRecord::Base
    has_many :addresses
    attr_accessible :email, :first_name, :last_name
end
class Address < ActiveRecord::Base
    belongs_to :entry
    belongs_to :address_type
    attr_accessible :city, :state, :street, :zip
end

そして私の_formファイル:

 ...
 .form-inputs
= f.collection_select (:address_type_id, AddressType.all, :id, :name)
= f.input :street
= f.input :city

「作成」を押した後、「保護された属性を一括割り当てできません: address_type_id」というエラーが表示されます。どこかで間違いを犯さなければならないことはわかっていますか?

于 2013-02-26T18:59:56.937 に答える