2013-02-26 21 views
0

我有更新我的代碼如下:Rails的:要顯示的子類的含量根據其ID

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

如果你要更新你的問題,編輯你的問題,而不是答案。如果你想通知任何回答的人,請在他們的回答下留下評論。 – Mike 2013-02-26 20:11:45

回答

0

根據你的對象關係,你可以做這樣的事情:

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

也許(這取決於你怎麼想它的工作),有時一個地址不會與它連接的地址類型。爲了支持這一點,並防止對無例外,你可以做到以下幾點:

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

try方法是在其名稱中明確:它會嘗試(這裏name)調用該方法的地址類型對象。如果這一個是nil或者對name方法沒有響應,它將返回nil而不會引發Nil:NilClass的NoMethodError。

你的關係設置不正確:

一個地址只能有一個(最大)地址類型。換句話說,地址類型可以設置爲零,一個或多個地址。這意味着,在鐵軌(和共同語言,容易readeable和理解):

  • 的地址belongs_to的地址類型
  • 的地址類型has_many地址

這些關係可以這樣設置如下:(i摘下無關的其他陳述)

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中的前一列,並在地址表中添加一列)。

編輯

我已經更新了我的代碼如下:

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 

我的模型: 類地址類型<的ActiveRecord :: Base的 的has_many:地址 attr_accessible:命名 結束

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

我試過了你的解決方案,並提示出錯:「SQLite3 :: SQLException:no such column:address_types.address_id:SELECT」address_types「。* FROM」address_types「WHERE」address_types「。」address_id「= 3 LIMIT 1」。我不確定我哪裏出錯了? – 2013-02-26 19:11:44

+0

我沒有在我的addressType遷移中添加_index address_id,這是它的原因嗎? – 2013-02-26 19:14:39

+0

我覺得有一個困惑:Address對象應該有'address_type_id',而不是AddressType。您的關係設置不正確,地址belongs_to地址類型和地址類型has_many地址(告訴我您是否需要一些代碼來幫助您) – MrYoshiji 2013-02-26 19:17:24