2016-11-25 74 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

你初始化了地址對象 –