我已将代码更新如下:
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”。我知道我必须在某个地方犯错误吗?
答案 0 :(得分: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
方法,则会返回belongs_to
并且不会针对Nil:NilClass提出NoMethodError。
您的关系设置不正确:
地址只能有一个(最大)地址类型。另一方面,地址类型可以设置为零,一个或多个地址。这意味着,在Rails中(和通用语言一样,易于理解和可理解):
has_many
和AddressType 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
这意味着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
的列,它将引用特定的AddressType(Home,Work或其他)。 (您可能必须运行迁移才能销毁AddressType中的上一列,并在地址表中添加一列)。
修改强>:
我已按以下方式更新了我的代码:
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
我的模特: class AddressType&lt;的ActiveRecord :: Base的 has_many:地址 attr_accessible:name 端
...
.form-inputs
= f.collection_select (:address_type_id, AddressType.all, :id, :name)
= f.input :street
= f.input :city
我的_form文件:
{{1}}
点击“创建”后,错误显示“无法批量分配受保护的属性:address_type_id”。我知道我必须在某处犯错吗?