Ruby on rails Rails:希望根据其ID显示子类的内容
我已按以下方式更新我的代码:Ruby on rails Rails:希望根据其ID显示子类的内容,ruby-on-rails,subclass,matching,Ruby On Rails,Subclass,Matching,我已按以下方式更新我的代码: 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
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
# in view (HAML)
%th Address Type
%td= address.address_type.try(:name)
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
在我点击“创建”后,一个错误显示“不能批量分配受保护的属性:地址\类型\ id”。我知道我一定在什么地方犯了一些错误?根据你的对象关系,你可以这样做:
# in view (HAML)
%th Address Type
%td= address.address_type.name
也许(取决于您希望它如何工作)有时候一个地址没有与之链接的AddressType。要支持此操作并防止出现零异常,可以执行以下操作:
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
# in view (HAML)
%th Address Type
%td= address.address_type.try(:name)
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
try
方法的名称是明确的:它将尝试调用AddressType对象的方法(此处为name
)。如果此方法为nil
或不响应name
方法,则它将返回nil
,并且不会为nil:NilClass引发NoMethodError
您的关系设置不正确:
一个地址只能有一个(最大)地址类型。另一方面,地址类型可以设置为零、一个或多个地址。这意味着,在Rails中(以及通用语言,易于阅读和理解):
- 地址
属于地址类型
- 地址类型
有许多
地址
在我点击“创建”后,一个错误显示“不能批量分配受保护的属性:地址\类型\ id”。我知道我一定在什么地方犯了一些错误 我尝试了您的解决方案,但出现了一个错误提示:“SQLite3::SQLException:没有这样的列:address\u types.address\u id:选择“address\u types”。*从“address\u types”中选择“address\u types”。“address\u id”=3限制1。我不确定哪里出错了?我没有在addressType migrate中添加索引地址id,这是原因吗?我认为有一个混淆:address对象应该有
地址类型id
,而不是addressType。你的关系设置不正确,一个地址属于一个地址类型,一个地址类型有许多地址(如果你需要一些代码来帮助你,请告诉我)谢谢,Yoshiji先生。请您提供一些代码,这将对理解这些概念和关系有很大帮助。谢谢Yoshiji先生,我在我的问题中更新了代码,但出现了新的错误,请帮助我解决。如果您要更新您的问题,请编辑您的问题,而不是答案。如果您想通知任何回答的人,请在他们的回答下方留下评论。
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-inputs
= f.collection_select (:address_type_id, AddressType.all, :id, :name)
= f.input :street
= f.input :city