使用嵌套实体设计注册

时间:2016-11-25 13:14:38

标签: ruby-on-rails devise nested-forms

我正在构建一个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

由于

1 个答案:

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

您需要添加与您在控制器上接收的参数对应的内容。