在 sign_up 上使用嵌套形式的设计
Using devise with nested form on sign_up
表格没有显示 Pessoa 的字段,怎么了?
<%= form_for(resource, as: resource_name, url: registration_path(resource_name)) do |f| %>
<%= devise_error_messages! %>
<h4>Usuário</h4>
<%= f.email_field :email, autofocus: true %>
<% if @minimum_password_length %>
<em>(<%= @minimum_password_length %> characters minimum)</em>
<% end %><br />
<%= f.password_field :password, autocomplete: "off" %>
<%= f.password_field :password_confirmation, autocomplete: "off" %>
<h4>Pessoa</h4>
<%= f.fields_for :pessoa do |p| %>
<%= p.text_field :nome %>
<% end %>
<div class="actions">
<%= f.submit "Cadastrar" %>
</div>
<% end %>
我刚刚看到,电子邮件、密码和密码确认...
class 用户:
class Usuario < ActiveRecord::Base
has_one :pessoa
has_many :pedidos, through: :pessoa
accepts_nested_attributes_for :pessoa
和注册控制器:
class Usuarios::RegistrationsController < Devise::RegistrationsController
def new
build_resource(sign_up_params)
self.resource.pessoa = Pessoa.new
respond_with self.resource
end
def create
super
end
private
def sign_up_params
params.require(:user).permit(pessoas_attributes: [:nome])
end
end
佩索阿是乌苏里奥的,好吗?并需要显示电子邮件、密码、密码确认和姓名。提交时需要将注册的值保存在两个表(Usuarios 和 Pessoas)中。我错了什么?谢谢!
编辑
Pessoa 显示的表格,但是我填完数据后,没有保存到数据库中,为什么?我做了我被要求做的事。用户值保存正常,但 pessoas 不保存。
在您的控制器中,sign_up_params
从 pessoas_attributes
更改为 pessoa_attributes
,因为您的模型中有 has_one
关系。
也在 sign_up_params
方法中你需要更改你的参数键,你有 :user
但它似乎是 :usuario
此外:您可以将以下方法添加到用户模型中:
user.rb
def with_pessoa
self.pessoa = Pessoa.new
self
end
并修改视图:
new.html.erb
...
<% form_for [resource_name, resource.with_pessoa], :url => registration_path(resource_name) do |f| %>
...
<% f.fields_for :pessoa do |pessoa_form| %>
...
<% end %>
这样,您将拥有向用户添加 1 比索的嵌套表单。要为用户动态添加多个比索,请选中 Railcast #197 by Ryan Bates。确保您将这对资源作为数组传递,否则您将收到如下错误:“参数数量错误(3 代表 2)”。
表格没有显示 Pessoa 的字段,怎么了?
<%= form_for(resource, as: resource_name, url: registration_path(resource_name)) do |f| %>
<%= devise_error_messages! %>
<h4>Usuário</h4>
<%= f.email_field :email, autofocus: true %>
<% if @minimum_password_length %>
<em>(<%= @minimum_password_length %> characters minimum)</em>
<% end %><br />
<%= f.password_field :password, autocomplete: "off" %>
<%= f.password_field :password_confirmation, autocomplete: "off" %>
<h4>Pessoa</h4>
<%= f.fields_for :pessoa do |p| %>
<%= p.text_field :nome %>
<% end %>
<div class="actions">
<%= f.submit "Cadastrar" %>
</div>
<% end %>
我刚刚看到,电子邮件、密码和密码确认... class 用户:
class Usuario < ActiveRecord::Base
has_one :pessoa
has_many :pedidos, through: :pessoa
accepts_nested_attributes_for :pessoa
和注册控制器:
class Usuarios::RegistrationsController < Devise::RegistrationsController
def new
build_resource(sign_up_params)
self.resource.pessoa = Pessoa.new
respond_with self.resource
end
def create
super
end
private
def sign_up_params
params.require(:user).permit(pessoas_attributes: [:nome])
end
end
佩索阿是乌苏里奥的,好吗?并需要显示电子邮件、密码、密码确认和姓名。提交时需要将注册的值保存在两个表(Usuarios 和 Pessoas)中。我错了什么?谢谢!
编辑
Pessoa 显示的表格,但是我填完数据后,没有保存到数据库中,为什么?我做了我被要求做的事。用户值保存正常,但 pessoas 不保存。
在您的控制器中,sign_up_params
从 pessoas_attributes
更改为 pessoa_attributes
,因为您的模型中有 has_one
关系。
也在 sign_up_params
方法中你需要更改你的参数键,你有 :user
但它似乎是 :usuario
此外:您可以将以下方法添加到用户模型中:
user.rb
def with_pessoa
self.pessoa = Pessoa.new
self
end
并修改视图:
new.html.erb
...
<% form_for [resource_name, resource.with_pessoa], :url => registration_path(resource_name) do |f| %>
...
<% f.fields_for :pessoa do |pessoa_form| %>
...
<% end %>
这样,您将拥有向用户添加 1 比索的嵌套表单。要为用户动态添加多个比索,请选中 Railcast #197 by Ryan Bates。确保您将这对资源作为数组传递,否则您将收到如下错误:“参数数量错误(3 代表 2)”。