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中(以及通用语言,易于阅读和理解):

  • 地址
    属于地址类型
  • 地址类型
    有许多
    地址
这些关系可以如下设置:(我去掉了不相关的其他语句)

我的模型: 类AddressType
在我点击“创建”后,一个错误显示“不能批量分配受保护的属性:地址\类型\ 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