嵌套表单:如果没有输入 child 的信息,则不应保存
Nested form: shouldn't save if no information for child is entered
我有一个嵌套表单来注册一个新组织和 1 个成员(1:组织与其成员之间的多种关系)。两者在模型文件和迁移文件中都有验证。
问题:如果两者的信息输入不正确,我希望表格不要注册任何东西(不是组织或成员)。
目前,当我注册一个新组织但将成员的所有变量留空时,它会在没有错误消息的情况下注册该组织,并且不会注册任何成员。
相反,我希望它也尝试写入成员,然后产生错误消息,因为成员的某些变量不允许为空。由于该错误,在成员信息也正确之前,它也不应保存组织。
如果我为成员输入一些信息,这确实可以正常工作:如果成员无效,它不会保存组织或成员并给出错误。如果我为成员输入有效信息而没有为组织输入信息,它也可以正常工作:它会产生错误并且不保存任何内容。但是,如果我为组织输入有效信息而没有为成员输入任何信息,它就不起作用:它不会产生任何错误并且只保存组织。
我应该如何更改我的代码来调整它?
观点:
<%= render partial: "registrationform", locals: { url: organizations_path } %>
partial/form:
<%= form_for @organization, url: url do |f| %>
<%= render 'shared/error_messages', object: f.object %>
<h4>Details of the organization:</h4>
<%= f.text_field :name, class: 'form-control' %>
<%= f.fields_for :members do |p| %>
<h4>Your personal details:</h4>
<%= p.text_field :username, class: 'form-control' %>
<%= p.email_field :email, class: 'form-control' %>
<%= p.password_field :password, class: 'form-control' %>
<%= p.password_field :password_confirmation, class: 'form-control' %>
<% end %>
<%= f.submit "Sign up", class: "formbutton btn btn-default" %>
<% end %>
控制器:
def new
if (logged_in?)
flash[:danger] = "You're already logged in"
redirect_to root_url
end
@organization = Organization.new
@member = @organization.members.build
end
def create
@organization = Organization.new(new_params)
if @organization.save
@organization.members.each do |single_member|
single_member.send_activation_email
end
flash[:success] = "Please check your email to activate your account."
redirect_to root_url
else
@organization.members.build if @organization.members.blank?
render 'new'
end
end
private
def new_params
params.require(:organization).permit(:name,
members_attributes: [:email,
:username,
:password,
:password_confirmation
])
end
在您的组织模型中,您可以检查成员
class Organization
validate :check_member
def check_member
if members.empty?
errors.add(:base, 'Member is not present')
end
end
end
我有一个嵌套表单来注册一个新组织和 1 个成员(1:组织与其成员之间的多种关系)。两者在模型文件和迁移文件中都有验证。
问题:如果两者的信息输入不正确,我希望表格不要注册任何东西(不是组织或成员)。
目前,当我注册一个新组织但将成员的所有变量留空时,它会在没有错误消息的情况下注册该组织,并且不会注册任何成员。
相反,我希望它也尝试写入成员,然后产生错误消息,因为成员的某些变量不允许为空。由于该错误,在成员信息也正确之前,它也不应保存组织。
如果我为成员输入一些信息,这确实可以正常工作:如果成员无效,它不会保存组织或成员并给出错误。如果我为成员输入有效信息而没有为组织输入信息,它也可以正常工作:它会产生错误并且不保存任何内容。但是,如果我为组织输入有效信息而没有为成员输入任何信息,它就不起作用:它不会产生任何错误并且只保存组织。
我应该如何更改我的代码来调整它?
观点:
<%= render partial: "registrationform", locals: { url: organizations_path } %>
partial/form:
<%= form_for @organization, url: url do |f| %>
<%= render 'shared/error_messages', object: f.object %>
<h4>Details of the organization:</h4>
<%= f.text_field :name, class: 'form-control' %>
<%= f.fields_for :members do |p| %>
<h4>Your personal details:</h4>
<%= p.text_field :username, class: 'form-control' %>
<%= p.email_field :email, class: 'form-control' %>
<%= p.password_field :password, class: 'form-control' %>
<%= p.password_field :password_confirmation, class: 'form-control' %>
<% end %>
<%= f.submit "Sign up", class: "formbutton btn btn-default" %>
<% end %>
控制器:
def new
if (logged_in?)
flash[:danger] = "You're already logged in"
redirect_to root_url
end
@organization = Organization.new
@member = @organization.members.build
end
def create
@organization = Organization.new(new_params)
if @organization.save
@organization.members.each do |single_member|
single_member.send_activation_email
end
flash[:success] = "Please check your email to activate your account."
redirect_to root_url
else
@organization.members.build if @organization.members.blank?
render 'new'
end
end
private
def new_params
params.require(:organization).permit(:name,
members_attributes: [:email,
:username,
:password,
:password_confirmation
])
end
在您的组织模型中,您可以检查成员
class Organization
validate :check_member
def check_member
if members.empty?
errors.add(:base, 'Member is not present')
end
end
end