2016-11-25 50 views
0

我正在构建一个Rails应用程序,用户可以拥有更多地址。为嵌套实体设计注册

User has_many :addresses 
Address belong_to :user 

我使用Devise进行身份验证。我想要一个用户实体和第一个地址实体在用户注册时由一个表单创建。

<%= 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的::协会未定义的方法 '街' :: 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”的零:NilClass

感谢

回答

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 %> 

而且您需要在控制器上添加相应的参数。

+0

这就是答案!尽管我会添加控制器代码,因为他确实要求特定的控制器代码。 – fbelanger

+0

嗨,我已经'accepted_nested_attributes_for:addresses'。 看到我的更新以上请通过 –

+0

你初始化了地址对象 –