在Devise注册新用户期间,我需要同时创建一个指向该新用户的新Family对象链接(该用户是该家庭的负责人)。
我的家庭模型:
belongs_to user
我的用户模型:
attr_accessible :name, :email, :password, :password_confirmation, :remember_me, :family
has_one :family
accepts_nested_attributes_for :family
在design/registration/new.html.erb 中
<%= simple_form_for([resource, Family.new], :as => resource_name, :url => registration_path(resource_name), :html => {:class => 'form-vertical' }) do |f| %>
<%= f.error_notification %>
<%= display_base_errors resource %>
<%= f.input :name, :autofocus => true %>
<%= f.input :email, :required => true %>
<%= f.input :password, :required => true %>
<%= f.input :password_confirmation, :required => true %>
<% f.fields_for :family do |family_form| %>
<p><%= family_form.label :name %></p>
<p><%= family_form.text_field :name %></p>
<% end %>
<%= f.button :submit, 'OK', :class => 'btn-primary' %>
<% end %>
但这不起作用,我发现了几个这样的问题,但我没能解决。
知道吗?
更新1
我得到以下错误:
undefined method `email' for #<Family:0x007f892a12c310>
家庭是一个没有任何电子邮件,只有一个名字的模式。我只需要能够在创建新用户时创建一个具有名称的新族对象(并将其链接到用户)。
更新2
我已在注册控制器中添加了resource.build_family。族对象已正确创建并与用户关联(我可以在new.html.erb中显示<%=resource.family%>进行调试),但仍然没有显示族的窗体。
您需要<%中的等号=的字段
<%= f.fields_for :family do |family_form| %>
<p><%= family_form.label :name %></p>
<p><%= family_form.text_field :name %></p>
<% end %>
在您的用户模型中,您需要使:family_attribues可访问,而不是:family
attr_accessible :name, :email, :password, :password_confirmation, :remember_me, :family_attributes
has_one :family
accepts_nested_attributes_for :family
如果您正在获得undefined method 'email' for #<Model:0x007f892a12c310>
:
您需要覆盖Devise::RegistrationsController
,如文档中所述:https://github.com/heartcombo/devise#configuring-控制器。例如
class Users::RegistrationsController < Devise::RegistrationsController
def new
super do |resource|
resource.build_<model>
end
end
end
并且必须仅在form_for
:simple_form_for(resource, ...
中指定resource
,而不是simple_form_for([resource, Model.new], ...