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
这解决了我的问题。
谢谢。
答案 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