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

也许(取决于您希望它如何工作)有时一个地址不会有与之链接的地址类型。为了支持这一点并防止出现 Nil 异常,您可以执行以下操作:

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

try方法的名称是明确的:它将尝试调用该方法(此处name)到 AddressType 对象。如果此方法nil响应或不响应该name方法,它将返回nil并且不会为 Nil:NilClass 引发 NoMethodError。

您的关系设置不正确:

一个地址只能有一个(最大)地址类型。另一方面,地址类型可以设置为零、一个或多个地址。这意味着,在 Rails 中(以及通用语言,易于阅读和理解):

  • 一个地址belongs_to一个地址类型
  • 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_type_id将引用特定的地址类型(家庭、工作或其他)。(您可能必须运行迁移才能破坏 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 回答