0

我有以下型号:

class Property < ApplicationRecord

  # Other validations 

  has_one :address
  accepts_nested_attributes_for :address, update_only: true

end 

class Address < ApplicationRecord
  has_one :country
  has_one :state
  has_one :city
  has_one :suburb

  belongs_to :property
end

countrystate和的关系都通过 acity和相互关联。suburbhas_manybelongs_to

问题是 :

在我的properties/_form.html.erb文件中,我尝试使用嵌套fields_for:address和在那些嵌套字段上创建地址options_from_collection_for_select。下面的代码:

  <fieldset>
    <div class="form-group">
      <%= form.label :address, "Dirección", class: "col-sm-2 control-label"%>
      <div class="col-sm-9">
          <%= form.fields_for :address do |ff| %>
            <div class="row">
              <div class="col-sm-4">
                <select class="form-control" name="property[address_attributes][country_id]" >
                  <%= options_from_collection_for_select(Country.all, :id, :name) %>
                </select>
              </div>
              <div class="col-sm-4">
                <select class="form-control"  name="property[address_attributes][state_id]" >
                  <%= options_from_collection_for_select(State.all, :id, :name) %>
                </select>
              </div>
              <div class="col-sm-4">
                <select class="form-control"  name="property[address_attributes][city_id]" >
                  <%= options_from_collection_for_select(City.all, :id, :name) %>
                </select>

并在提交时收到此错误:

提交错误

更新 1

所以我用这个改变了我的表格:

<%= ff.select :country, options_from_collection_for_select(Country.all, :id, :name) %>

在我所有的关系上,现在我得到的错误是:

Country(#70194352893700) expected, got "1" which is an instance of String(#70194311847460)

Country 期望得到 whis 是 String 的一个实例

更新 2:

这是我schema.rb描述我的addresses表的代码:

  create_table "addresses", force: :cascade do |t|
    t.string "street"
    t.integer "number"
    t.integer "zip_code"
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
    t.integer "property_id"
    t.integer "countries_id"
    t.integer "states_id"
    t.integer "cities_id"
    t.integer "suburbs_id"
    t.index ["cities_id"], name: "index_addresses_on_cities_id"
    t.index ["countries_id"], name: "index_addresses_on_countries_id"
    t.index ["property_id"], name: "index_addresses_on_property_id"
    t.index ["states_id"], name: "index_addresses_on_states_id"
    t.index ["suburbs_id"], name: "index_addresses_on_suburbs_id"
  end
4

1 回答 1

1

我猜你的address 上没有country_id字段,即使你的Address 模型说应该有关系。

您可以通过查看来验证db/schema.rb

如果address表缺少该列,您可以在命令行上执行以下操作来添加它:

rails g migration add_country_id_to_addresses country:belongs_to

然后运行rake db:migrate

上面的说明中涉及到一点“魔法”,所以这里有一个解释。

rails g migration告诉 Rails 生成数据库迁移。

add_country_to_addresses是迁移的名称。AddCountryToAddresses如果您通过snake_case 进入CamelCase,您也可以使用。如果 rails在迁移名称的末尾找到_to_*(或),它可以推断要为其生成迁移的表的名称。To*在这种情况下,addresses表。

country:belongs_to告诉 Rails 迁移应该将表链接addressescountries表。它将添加一country_id列并且(取决于您的数据库设置)将为新列生成索引和/或外键。

更新

db/schema.rb表明您实际上country_id在该表上没有字段。你有一个countries_id领域。

要解决此问题,您可以生成一个空白迁移:

rails g migration rename_countries_id_on_addresses

然后编辑迁移以包含:

change_table :addresses do |t|
  t.rename :countries_id, :country_id
end

然后运行迁移:

rake db:migrate

您可以在此处找到有关使用迁移更改表的更多信息:https ://guides.rubyonrails.org/active_record_migrations.html#changing-tables

于 2018-08-10T02:09:02.500 回答