rails中的has_one和迁移问题?

时间:2017-04-21 06:04:24

标签: ruby-on-rails ruby nested-forms

我有以下模特

  • 地址
  • 汽车
  • 用户

我在模型中有以下关系。

  • 每辆车都有一个地址(一对一的关系)
  • 每个用户都有一个地址(一对一的关系)

地址模型

class Address < ApplicationRecord
  belongs_to :car
  belongs_to :user
end

汽车模型

class Car < ApplicationRecord
  has_one :address
  accepts_nested_attributes_for :address
end

用户模型

class User < ApplicationRecord
  has_one :address
  accepts_nested_attributes_for :address
end

数据库表

  • Car有一个列address_id作为外键
  • 用户将列address_id作为外键

迁移 用户

class CreateUsers < ActiveRecord::Migration[5.0]
  def change
    create_table :users do |t|
      t.string :username
      ...

      t.references :Address, foreign_key: true
    end
  end
end

汽车迁移

class CreateCars < ActiveRecord::Migration[5.0]
  def change
    create_table :cars do |t|
      t.string :chasis
      ...

      t.references :Address, foreign_key: true
    end
  end
end

现在,当我尝试从User / new.html.erb创建嵌套表单时,我收到以下错误。

user_id是地址中的未知属性。

User_controller.rb

class UsersController < ApplicationController
  def new
    @user = User.new
    @user.build_address
  end

  ...
end

我的嵌套表单未呈现。

嵌套表格

<%= form_for @user, html: { class: 'form-horizontal' } do |f|%>
  <%= f.fields_for :address do |fact| %>
    <div class="field form-group">
      <%= f.label :add1, class: 'col-sm-2 control-label' %>
      <div class="col-sm-10">
        <%= f.text_field :add1, class: 'form-control' %>
      </div>
    </div>
    <div class="field form-group">
      <%= f.label :add2, class: 'col-sm-2 control-label' %>
      <div class="col-sm-10">
        <%= f.text_field :add2, class: 'form-control' %>
      </div>
    </div>
  <% end %>
  <div class="field form-group">
    <div class="col-sm-offset-2 col-sm-2">
      <%= f.submit class: 'form-control btn btn-primary' %>
    </div>
  </div>      
<% end %>

我怀疑我的迁移文件存在一些问题。但数据库表是以我想要的方式创建的。

2 个答案:

答案 0 :(得分:0)

不太确定但是:

 t.references :Address, foreign_key: true

不应该

 t.references :address, foreign_key: true

注意:address

中的小(a)

答案 1 :(得分:0)

用户ID不存在。

首先您必须保存用户。你可以试试fact.addr而不是f.addr

您可以发布用户控制器文件的完整代码。

<%= form_for @person, url: {action: "create"} do |person_form| %>
  <%= person_form.text_field :name %>
  <%= fields_for @person.contact_detail do |contact_detail_form| %>
    <%= contact_detail_form.text_field :phone_number %>
  <% end %>
<% end %>


<form accept-charset="UTF-8" action="/people" class="new_person" id="new_person" method="post">
  <input id="person_name" name="person[name]" type="text" />
  <input id="contact_detail_phone_number" name="contact_detail[phone_number]" type="text" />
</form>

如果保存@person,它也会自动保存联系人数据。

请参阅此链接以获取更多信息

http://guides.rubyonrails.org/form_helpers.html