Rails:希望根据其ID显示子类的内容

时间:2013-02-26 18:53:02

标签: 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

  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”。我知道我必须在某个地方犯错误吗?

1 个答案:

答案 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对象。如果此nilname或未响应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”。我知道我必须在某处犯错吗?