代码之家  ›  专栏  ›  技术社区  ›  Chong Yue

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

  •  0
  • Chong Yue  · 技术社区  · 11 年前

    我已经更新了我的代码如下:

    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 回复  |  直到 11 年前
        1
  •  0
  •   Yaakov Ellis NevilleDNZ    11 年前

    根据对象关系,您可以执行以下操作:

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

    也许(取决于你希望它如何工作)有时一个地址不会有一个AddressType链接到它。为了支持这一点并防止出现Nil异常,你可以执行以下操作:

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

    这个 try 方法的名称是显式的:它将尝试调用该方法(此处 name )到AddressType对象。如果这个是 nil 或对 名称 方法,它将返回 并且不会为Nil:NilClass引发NoMethodError。

    您的关系设置不正确:

    一个地址只能有一个(最大)地址类型。另一种方式是,地址类型可以设置为零、一个或多个地址。这意味着,在Rails(以及通用语言中,易于阅读和理解)中:

    • 地址 belongs_to 地址类型
    • 地址类型 has_many 致辞

    这些关系可以设置如下:(我去掉了其他未发布的声明)

    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中的前一列,并在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
    

    我的模型: 类地址类型<ActiveRecord::基本 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”。我知道我一定在哪里犯了一些错误?