Rails 5:为什么我不能保存嵌套属性?

时间:2019-07-09 20:31:25

标签: ruby-on-rails

我正在努力理解这一点。

我有两个模型PersonAddressPerson接受Address的嵌套属性。

class Person < ApplicationRecord
  has_one :address, dependent: :destroy
  accepts_nested_attributes_for :address

我有一个app/views/person/new.html.erb表格:

<%= bootstrap_form_for(@person) do |f| %>
  #...
  <%= f.fields_for :address do |ff| %>
    <%= ff.text_field :apartment_number %>
    <%= ff.text_field :building_name %>
    <%= ff.text_field :building_number %>
    <%= ff.text_field :street %>
    <%= ff.text_field :town %>
    <%= ff.text_field :postcode, required: true %>
  <% end %>
#...

我已经建立了强大的参数,并且创建了如下新记录:

  def create
    @person = Person.new(safe_params)

    if @person.save
      binding.pry
    else
      render 'new'
    end
  end

  private

  def safe_params
    params.require(:person).permit(
      :name,
      :date_of_birth,
      address: %i[
        apartment_number
        building_name
        building_number
        street
        town
        postcode
      ]
    )
  end

但是,这里有两件事。如果@person验证失败,则重新渲染的new视图将不包含已提交的地址数据。其次,如果保存成功,则可以看到未创建关联的地址:

@person.address
=> nil

我该怎么做才能确保创建并保存address?我误会了明显的东西吗?

1 个答案:

答案 0 :(得分:1)

根据docs on nested attributes,强参数必须以_attributes结尾

params.require(:person).permit(
  :name,
  :date_of_birth,
  address_attributes: %i[ apartment_number ]
)