Rails5。嵌套属性不会转到数据库

时间:2017-11-23 17:26:20

标签: ruby-on-rails

class User < ApplicationRecord
  has_one :address
  accepts_nested_attributes_for :address
end

class Address < ApplicationRecord
  belongs_to :user
end

<%= form_for @user do |f| %>
  .... // some filed here everything fine
  <%= f.fields_for :address do |a| %>
     <%= a.text_field :city %> // this field is not appear
  <% end %>
<% end %>

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

  def create
    @user = User.new(user_params)
    if @user.valid?
      @user.save
    else
      redirect_to root_path
    end
  end

  private
    def user_params
      params.require(:user).permit(:id, :name, :email, :password, :password_confirmation, :status, :image, :address_attributes => [:id, :city, :street, :home_number, :post_code, :country])
    end
end

所以你可以看到上面我有两个类和一个表单,当我在尝试显示字段的地址类我不能这样做。我从https://apidock.com/rails/ActionView/Helpers/FormHelper/fields_for中取了这个例子 我正在尝试不同的组合,例如在表单定义中使用User.new和Address.new它不能正常工作,我能够在那种情况下显示所有字段但我无法将地址数据保存到表中,因为“未经处理的地址“。

有人可以解释我做错了什么吗?或者至少请给我一些提示。

[解决] 我应该学习如何正确阅读文件。像@Srack这样的翻译说我只需要使用build_address方法。我再次检查了文档rails api,并在页面末尾有一些示例说创建User类,如下所示:

class User < ApplicationRecord
  has_one :address
  accepts_nested_attributes_for :address
  def address
    super || build_address
  end
end

这解决了我的问题。

谢谢。

1 个答案:

答案 0 :(得分:3)

您必须确保在address视图中为用户实例new。你可以这样做:

def new
  @user = User.new
  @user.build_address
end

然后,您应该看到表单上的地址字段。

nested_fields_for显示已初始化属于父级的记录的字段。我认为后者是你以前的尝试没有奏效的原因。

FYI build_address是由belongs_to关联生成的方法:http://guides.rubyonrails.org/association_basics.html#methods-added-by-belongs-to