我正在构建一个Rails应用程序,用户可以在其中拥有更多地址。
User has_many :addresses
Address belong_to :user
我正在使用Devise进行身份验证。我希望在用户注册时由一个表单创建一个User实体和第一个Address实体。
<%= form_for(resource, as: resource_name, url: registration_path(resource_name)) do |f| %>
<%= f.email_field :email %><br />
<%= t.password_field :password %><br />
<%= f.fields_for resource.addresses do |a| %>
<%= a.text_field :street %>
<% end %>
<% end %>
但我得到了
ActiveRecord的未定义方法'street':: Associations :: CollectionProxy []
控制器必须做什么?
由于
修改
我已经在用户模型中了:
accepts_nested_attributes_for :addresses
我已经更新了我的控制器:
class Users::RegistrationsController < Devise::RegistrationsController
# GET /resource/sign_up
def new
# super
build_resource({})
yield resource if block_given?
resource.addresses.build
respond_with resource
end
end
并查看:
<%= form_for(resource, as: resource_name, url: registration_path(resource_name)) do |f| %>
<%= f.email_field :email %><br />
<%= t.password_field :password %><br />
<%= f.fields_for resource.addresses.first do |a| %>
<%= a.text_field :street %>
<% end %>
所以表格正在显示。但是当我发帖时,resource.addresses.first
仍为空:
未定义的方法`model_name'为nil:NilClass
由于
答案 0 :(得分:1)
您需要添加accepts_nested_attributes_for地址
Class User < ActiveRecord::Base
has_many :addresses
accepts_nested_attributes_for :addresses
end
您还需要初始化地址对象,您可以在控制器级别(最佳方法)或在视图中执行此操作
<%= form_for(resource, as: resource_name, url: registration_path(resource_name)) do |f| %>
<%= f.email_field :email %><br />
<%= t.password_field :password %><br />
<% resource.addresses.build %>
<%= f.fields_for resource.addresses do |a| %>
<%= a.text_field :street %>
<% end %>
<% end %>
您需要添加与您在控制器上接收的参数对应的内容。